摘 要:介紹了數(shù)據(jù)庫查詢速度緩慢的常規(guī)解決方法及其主要缺點,,提出利用Oracle分區(qū)功能解決問題,并結合油田開發(fā)數(shù)據(jù)庫現(xiàn)狀,,詳細描述了分區(qū)的具體實現(xiàn)方法,。結合使用情況,,總結實施效果,對大數(shù)據(jù)量表的維護和優(yōu)化有一定的參考價值,。
關鍵詞: Oracle數(shù)據(jù)庫 分區(qū)Partition 表空間" title="表空間">表空間Tablespace 數(shù)據(jù)文件" title="數(shù)據(jù)文件">數(shù)據(jù)文件Datafile
伴隨著信息高速公路的飛速建設,,油田的各項勘探開發(fā)數(shù)據(jù)都做到了及時準確入庫,數(shù)據(jù)庫中數(shù)據(jù)量日益增加,。以其下屬的某個采油廠為例,,數(shù)據(jù)量已達到2GB,各種數(shù)據(jù)庫表更是多達1千多個。與此同時,,又產(chǎn)生了一個新問題,,那就是雖然各種生產(chǎn)數(shù)據(jù)都已入庫,但是由于數(shù)據(jù)量巨大,,造成查詢速度非常緩慢,。
本文以油井日度數(shù)據(jù)表(dba01)為例進行說明。該表是最基礎的開發(fā)數(shù)據(jù),,每天每一口井都有記錄進入到數(shù)據(jù)庫中,。油田規(guī)定,該數(shù)據(jù)15個月內(nèi)必須保存在線,,15個月下來這個表就有997890條記錄,。
這接近100萬條的記錄大大增加系統(tǒng)開銷,在用戶提交查詢后,,經(jīng)常需要等待五六分鐘才能得到結果,,有時甚至查不出數(shù)據(jù),給用戶的感覺是仿佛處于“死機”狀態(tài),。
1 常規(guī)解決辦法
解決大表查詢速度緩慢的問題,,最初的對策是在后臺創(chuàng)建很多中間表。
例如:要得到采油廠生產(chǎn)日數(shù)據(jù)匯總情況,,了解全廠每天的油井開井數(shù),、水井開井數(shù)、日產(chǎn)油量、注采比等重要數(shù)據(jù),,其缺點主要有兩個:
(1)中間表的建立會占用大量表空間,,即查詢速度的提高是以犧牲服務器空間為代價,造成了巨大的資源浪費,;
(2)隨著各種應用的不斷開展,,中間表的數(shù)量也越來越多,這就人為加大了數(shù)據(jù)管理和維護的工作量,。
因此,,要從根本上解決大表存在的查詢速度緩慢的問題,必須找到更為有效的方法,。
2 采用分區(qū)功能解決問題
(1) 分區(qū)的定義
分區(qū)將表分離在若干不同的表空間上,,將大的表和索引拆分成小的易于管理的數(shù)據(jù)片段,分而治之支撐無限膨脹的大表,,給大表物理一級的可管理性,。將大表分割成較小的分區(qū)可以改善表的維護、備份,、恢復,、事務及查詢性能。針對我廠大量的油水井日度數(shù)據(jù),,可以推薦使用Oracle9的分區(qū)功能,。
(2)分區(qū)的優(yōu)點
首先,能夠成倍提高查詢速度:分區(qū)管理后,,服務器可以進行智能的分區(qū)檢測,。跳過與查詢無關的分區(qū)訪問,并跳過不在線的分區(qū),。
其次,,增強系統(tǒng)可用性" title="可用性">可用性:如果表的一個分區(qū)由于系統(tǒng)故障而不能使用,其余好的分區(qū)仍然可以使用,。
不同分區(qū)可以跨表空間存儲, 降低了磁盤損壞帶來的數(shù)據(jù)不可用性,。
3 分區(qū)的管理
(1)建立表的各個分區(qū)的表空間
下面是創(chuàng)建2004年第一季度" title="第一季度">第一季度表空間的操作語句,指定所建立表空間的名字,,所用數(shù)據(jù)文件的名稱,、大小和存放目錄,并由存儲字句指定在該空間中所建立對象的缺省存儲參數(shù),。
CREATE TABLESPACE ts_dba01_2004q1
DATAFILE ′/home2/oracle/test/dba01_2004q1.dat′SIZE 200MB DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0);
(2)建立分區(qū)表
下面是建立dba01表的操作語句,,指定表名、列名及列的數(shù)據(jù)類型等,。這些都與常規(guī)創(chuàng)建表的語句相同,。
CREATE TABLE dba01
(jh varchar2(16) not null,
rq date not null,
cyfs varchar2(3),
dwdm varchar2(11),
......
PARTITION BY RANGE (rq)
PARTITION dba01_2003q4
VALUES LESS THAN (TO_DATE(′2004-01-01′,′YYYY-MM-DD′)
TABLESPACE ts_dba01_2003q4,
PARTITION dba01_2004q1
VALUES LESS THAN (TO_DATE(′2004-04-01′,′YYYY-MM-DD′)
TABLESPACE ts_dba01_2004q1)
這是創(chuàng)建分區(qū)的語句,,指定按照日期進行分區(qū),例如:
日期>=′2004-01-01′并且<′2004-04-01′(即2004年第一季度)的數(shù)據(jù)放在dba01_2004q1分區(qū)內(nèi),。其他分區(qū)也依此原則建立,。
(3)分區(qū)表的擴充
在2004年年底,向表中加入2005年的表空間,,同樣是每季度一個表空間,,預計每個分區(qū)為200MB。下面是創(chuàng)建2005年第一季度表空間的操作語句,,指定表空間名稱,、數(shù)據(jù)文件名稱及大小等,。
CREATE TABLESPACE ts_dba01_2005q1
DATAFILE ′/home2/oracle/test/dba01_2005q1.dat′ SIZE 200MB
DEFAULT STORAGE (INITIAL 40m NEXT 40m MINEXTENTS 3 PCTINCREASE 0)
其他季度表空間也如此建立,。
(4)為表添加表空間
操作語句如下:
ALTER TABLE dba01
ADD PARTITION dba01_2005q1
VALUES LESS THAN (TO_DATE(′2005-04-01′,′YYYY-MM-DD′)
TABLESPACE ts_dba01_2005q1;
(5)刪除不必要的分區(qū)
采油廠規(guī)定:必須保存15個月的日度數(shù)據(jù)在線。到2005年,,必須把2003年3季度的數(shù)據(jù)備份,,將該分區(qū)刪除,騰出空間供后續(xù)數(shù)據(jù)循環(huán)使用,。刪除分區(qū) ALTER TABLE dba01 DROP PARTION dba01_2003q3;
利用操作系統(tǒng)工具刪除這個分區(qū)所占用的文件
oracle$ rm /home2/oracle/test/dba01_2003q3.dat
(6)查看分區(qū)信息
可通過對數(shù)據(jù)字典USER_EXTENTS進行查詢,操作如下:
SVRMGRL >SELECT * FROM user_extents
WHERE SEGMENT_NAME=′dba01′;
(7)卸載分區(qū)
Oracle9的EXPORT 工具可卸載分區(qū)并導出數(shù)據(jù),,例如到2002年,可將2000年的數(shù)據(jù)按分區(qū)卸載,。
例如:要卸載2003年3季度的數(shù)據(jù),,操作如下:
oracle$ exp tycx/***
tables=dba01:dba01_2003q3 file= dba01_2003q3.dmp
在語句中要指定用戶名、口令,、需要卸出的表名及分區(qū)名,、卸出文件名稱等。
(8)導入分區(qū)
Oracle9的IMPORT工具可導入分區(qū)并加載數(shù)據(jù),,例如在2005年,,用戶要查看2003年的數(shù)據(jù),必須導入該年數(shù)據(jù),。
· 建立該表2003年的四個表空間和相應的分區(qū),;
· 下面是導入2003年3季度分區(qū)數(shù)據(jù)的操作語句:
oracle$ imp tycx/***
file=dba01_2003q3.dmp tables= (dba01: dba01_2003q3)
4 實施效果
(1)能夠成倍提高查詢速度
分區(qū)管理后,服務器可以進行智能的分區(qū)檢測,跳過與查詢無關的分區(qū)訪問,跳過不在線的分區(qū),。
(2)增強系統(tǒng)可用性
如果表的一個分區(qū)由于系統(tǒng)故障而不能使用,,其余好的分區(qū)仍然可以使用。
不同分區(qū)可以跨表空間存儲, 降低了磁盤損壞帶來的數(shù)據(jù)不可用性,。
以油井日數(shù)據(jù)表為例:
不采用分區(qū)技術時,,若表空間文件受到破壞,會影響到所有數(shù)據(jù)都無法使用,,必須將該表全部記錄(多達100萬條)重新恢復,,工作量很大,,恢復期間用戶根本無法查詢數(shù)據(jù),完全不能使用,。
而采用分區(qū)技術后,,由于整個表已按季度拆分為6個分區(qū),因此當某一個表空間文件被破壞,,則僅是該分區(qū)表空間所對應的季度數(shù)據(jù)無法使用,,其他季度數(shù)據(jù)仍然可以正常使用,對用戶的查詢以及其他應用影響不大,。
通過合理應用Oracle9的分區(qū)功能,,可以大大改善系統(tǒng)的性能,降低大表數(shù)據(jù)管理和維護的工作量,,對大表的查詢,、增加、修改等操作可以分解到表的不同分區(qū)并行執(zhí)行,,可使運行速度更快,。對促進無紙化辦公,輔助生產(chǎn)有積極的推動作用,。
參考文獻
1 Joseph C.Johson , Matthew Weishan編著. Oracle8i DBA performance Tuning and Network Administrator. 北京:電子工業(yè)" title="電子工業(yè)">電子工業(yè)出版社,,2001
2 Carol McCullough-Dieter 編著. Oracle9i數(shù)據(jù)庫管理員:實現(xiàn)與管理. 北京:清華大學出版社,2003
3 Daniel Benjamin編著.OCP Oracle 9i Datebase New Features For Administrators考試指南.北京:電子工業(yè)出版社,,2002