摘 要: HWM(High Water Mark)是表中已經(jīng)使用過(guò)的存儲(chǔ)空間與未使用過(guò)的存儲(chǔ)空間之間的分界線,HWM對(duì)全表掃描的性能有非常大的影響。當(dāng)全表掃描時(shí),Oracle會(huì)讀取HWM下所有的塊,即使這些塊中有很多是空塊,空塊的存在,也即是表中碎片的存在,必將增加全表掃描額外的物理I/O開(kāi)銷及CPU開(kāi)銷,嚴(yán)重降低訪問(wèn)Oracle數(shù)據(jù)表的性能。通過(guò)對(duì)Oracle中關(guān)于表中HWM的原理及性能優(yōu)化問(wèn)題的討論,針對(duì)HWM下的碎片問(wèn)題提出相關(guān)的優(yōu)化策略,并對(duì)其空間重組前后進(jìn)行性能對(duì)比測(cè)試。
關(guān)鍵詞: Oracle; HWM; 性能優(yōu)化
Web2.0與Web3.0的發(fā)展都離不開(kāi)后臺(tái)支持?jǐn)?shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)運(yùn)行的好壞、快慢,直接影響到使用者的應(yīng)用,因而本文將重點(diǎn)研究信息資源建設(shè)中后臺(tái)數(shù)據(jù)庫(kù)的優(yōu)化策略。Oracle 數(shù)據(jù)庫(kù)是具有高可靠性、高安全性、高兼容性的大型關(guān)系型數(shù)據(jù)庫(kù),是信息化建設(shè)的重要基礎(chǔ)平臺(tái)。網(wǎng)絡(luò)中的信息資源數(shù)據(jù)庫(kù)具有異構(gòu)、數(shù)據(jù)量大、多媒體內(nèi)容多、查詢頻繁等特點(diǎn),伴隨網(wǎng)絡(luò)不斷深入的應(yīng)用,其存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)量越來(lái)越多,而傳統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)方法使得數(shù)據(jù)庫(kù)隨著訪問(wèn)數(shù)據(jù)量的增大其性能明顯地降低[1]。Oracle的邏輯空間管理是Oracle管理和優(yōu)化的重要部分,ASSM段空間自動(dòng)管理下的HWM問(wèn)題對(duì)Oracle的存儲(chǔ)管理和性能優(yōu)化有重大影響。本文在探討Oracle 10g邏輯存儲(chǔ)管理的基礎(chǔ)上,針對(duì)HWM下的碎片問(wèn)題提出了相關(guān)的優(yōu)化策略,并對(duì)其空間重組前后進(jìn)行了性能測(cè)試。
1 Oracle存儲(chǔ)管理
1.1 Oracle邏輯存儲(chǔ)管理
Oracle在邏輯存儲(chǔ)上分4個(gè)粒度,如圖1所示。
(1) Block(塊):粒度最小的存儲(chǔ)單位,標(biāo)準(zhǔn)默認(rèn)大小是8 KB,Oracle每一次I/O操作都是按Block來(lái)進(jìn)行的。
(2) Extent(區(qū)):由一系列相鄰的Block組成,是Oracle空間分配的基本單位[2],Oracle是以Extent為單位進(jìn)行擴(kuò)展的。
(3) Segment(段):由一系列的Extents所組成[2],當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí)(表或索引),就會(huì)分配一個(gè)Segment給這個(gè)對(duì)象。
(4) Tablespace(表空間):包括Segment、Extent和Block,Tablespace的數(shù)據(jù)物理上存儲(chǔ)在其所在的數(shù)據(jù)文件中,一個(gè)數(shù)據(jù)庫(kù)最少要有一個(gè)Tablespace。
1.2 HWM
高水標(biāo)記HWM(High-Water Mark)這個(gè)概念在Segment的存儲(chǔ)內(nèi)容中是比較重要的。簡(jiǎn)單來(lái)說(shuō),HWM代表一個(gè)表使用的最大(top limit)塊(如圖2所示),就是一個(gè)Segment中已使用和未來(lái)使用的Block的分界線[3]。圖2顯示了HWM首先位于新創(chuàng)建表的第一個(gè)塊中,隨著數(shù)據(jù)的插入和更新,使用了越來(lái)越多的塊,當(dāng)現(xiàn)有空間不足而進(jìn)行空間擴(kuò)展時(shí)HWM會(huì)隨之向上移。如果刪除一部分行數(shù)據(jù),可能會(huì)有許多塊不再包含數(shù)據(jù),但HWM不會(huì)往下移,被占用的最高空間稱為HWM。
Oracle在做全表掃描時(shí)會(huì)讀取HWM下的所有Blocks,即使其中不包含任何數(shù)據(jù),Oracle都會(huì)一一讀取,這會(huì)大大影響系統(tǒng)的性能,特別是當(dāng)HWM之下的大多數(shù)塊都為空時(shí)。
如果一個(gè)OLTP系統(tǒng)(即聯(lián)機(jī)事務(wù)處理,就是常說(shuō)的關(guān)系數(shù)據(jù)庫(kù),對(duì)記錄進(jìn)行增、刪、改、查)應(yīng)用頻繁地對(duì)某個(gè)表里的記錄進(jìn)行DML(Data Manipulation Language)操作(即數(shù)據(jù)操縱語(yǔ)言,一種命令使用戶能夠查詢數(shù)據(jù)庫(kù)以及操作已有數(shù)據(jù)庫(kù)中的數(shù)據(jù)的計(jì)算機(jī)語(yǔ)言),會(huì)造成Block中數(shù)據(jù)分布稀疏,導(dǎo)致HWM下存在大量的碎片,浪費(fèi)大量的空間。當(dāng)做全表掃描時(shí),Oracle會(huì)讀取HWM之下的所有塊,即使其中不包含數(shù)據(jù)[3]。對(duì)于HWM以下表的碎片,做全表訪問(wèn)時(shí)必然增加一致性讀,因而影響到響應(yīng)時(shí)間,降低系統(tǒng)性能。
2 優(yōu)化策略
對(duì)于增、刪、改操作比較頻繁的表,尤其是刪除操作比較頻繁的表,一般表的高水位HWM值會(huì)偏高,也就是表中數(shù)據(jù)塊碎片高,雖然ASSM的自動(dòng)空間管理能提高DML操作并發(fā)訪問(wèn)的性能,但是HWM下高碎片的產(chǎn)生會(huì)大大影響訪問(wèn)效率,而減少碎片、降低對(duì)象的HWM可提高對(duì)象的訪問(wèn)效率,從而達(dá)到性能優(yōu)化,大大提高數(shù)據(jù)的訪問(wèn)效率。表對(duì)象可以通過(guò)shrink或move方法實(shí)現(xiàn)重組、減少碎片、降低HWM,進(jìn)行性能優(yōu)化;索引對(duì)象可以提供rebuild的方法來(lái)實(shí)現(xiàn)重組、減少碎片、降低HWM,進(jìn)行性能優(yōu)化。當(dāng)然,在對(duì)表及索引進(jìn)行shrink或move及rebuild操作時(shí),最好選擇在非業(yè)務(wù)高峰時(shí)進(jìn)行,避免影響業(yè)務(wù)的正常運(yùn)轉(zhuǎn)。
shrink與move操作有一些不同,但都可以完成表中碎片的整理,在此可做一些比較:
(1) move的執(zhí)行效率比shrink高,因?yàn)閟hrink會(huì)產(chǎn)生redo log、undo log;
(2) shrink對(duì)數(shù)據(jù)的移動(dòng)是從后往前的,所以shrink不需要使用額外的空閑空間,而move是需要額外空閑空間的;
(3) 對(duì)帶有索引的表進(jìn)行shrink操作時(shí),索引是不需要重建的;而對(duì)帶有索引的表進(jìn)行move操作時(shí),索引是需要rebuild重建的,否則索引不可用;
(4) 對(duì)表進(jìn)行shrink操作時(shí),必須打開(kāi)表的行遷移屬性。
shrink和move都會(huì)對(duì)操作的表加表級(jí)獨(dú)占鎖,因此其他session對(duì)此表執(zhí)行 DML操作時(shí),存在鎖等待;當(dāng)shrink或move操作執(zhí)行完成,鎖釋放。
索引的rebuild是可以在線完成的,比較適合在高可用環(huán)境下完成。
另外,shrink是10g的新特性,僅對(duì)ASSM管理表空間有效。
具體命令操作如下:
shrink命令:
Alter table XXX enable row movement(打開(kāi)表XXX的行遷移屬性);
Alter table XXX shrink space(僅僅對(duì)表XXX進(jìn)行縮小,不對(duì)表中的索引進(jìn)行空間縮小);
Alter table XXX shrink space cascade(縮表的同時(shí),也對(duì)表中的索引進(jìn)行縮小);
Alter table XXX disable row movement(縮表完成后,關(guān)閉表XXX的行遷移屬性)。
move命令:
Alter table XXX move(對(duì)表進(jìn)行move);
Alter index YYY rebuild(如果表有索引,則需要對(duì)表的索引進(jìn)行重建)。
3 性能優(yōu)化測(cè)試
對(duì)于碎片較多的表,可以通過(guò)shrink或move操作降低表中HWM高水位的值來(lái)進(jìn)行性能優(yōu)化。下面以shrink命令為例子進(jìn)行測(cè)試。
3.1 對(duì)TEST表進(jìn)行分析
(1) 表大小
SQL> select segment_name, bytes/1024/1024 表大小MB from dba_segments where segment_name=′TEST′;
SEGMENT_NAME 表大小MB
TEST 5.632
(2) 表的實(shí)際數(shù)據(jù)大?。?.439 MB
SQL>select table_name, AVG_ROW_LEN ,NUM_ROWS,AVG_ROW_LEN*NUM_ROWS/1024/1024 表實(shí)際大小MB,LAST_ANALYZED from dba_tables where table_name=′TEST′;
TABLE_NAME AVG_ROW_LEN NUM_ROWS 表實(shí)際大小MB LAST_ANALYZED
TEST 157 16290 2.439 2012-12-01 00:13:12
(3)根據(jù)表實(shí)際大小公式可得出該表的碎片率為:56.7%
(1-表實(shí)際數(shù)據(jù)大小/表大小)×100/%=(1-2.439/5.632)×100%=56.7%碎片率:56.7%
(4)執(zhí)行SQL語(yǔ)句:select * from test;
查詢表test中所有記錄,查詢所需時(shí)間為2 s。
SQL的解釋計(jì)劃如下:
Execution Plan
|Id|Operation |Name |Rows | Cost (%CPU)| Time|
|0| SELECT STATEMENT | | | 141 (0)| |
|1| TABLE ACCESS FULL|TEST|16290|141(0)|00:00:02|
從以上的SQL解釋計(jì)劃來(lái)看,SQL采用的是全表掃描讀的方式訪問(wèn),SQL將讀取表的高水位HWM以下的所有數(shù)據(jù)塊。
由上可知: (1)表TEST的大小為5.632 MB, 但實(shí)際數(shù)據(jù)大小約為2.439 MB,碎片率約為56.7%,表TEST中存在大量的碎片; (2)查詢?cè)摫硭杏涗浰枰臅r(shí)間為2 s。
3.2 碎片重組 優(yōu)化處理
通過(guò)shrink方式對(duì)表TEST作碎片重組實(shí)現(xiàn)對(duì)表的優(yōu)化處理。
SQL> select segment_name, bytes/1024/1024 表大小MB from dba_segments where segment_name=′TEST′;
segment_name 表大小MB
TEST 5.632
SQL>alter table test enable row movement;
SQL>alter table test shrink space;
SQL>alter table test disable row movement;
SQL>select segment_name,bytes/1024/1024 表大小MB from dba_segments where segment_name=′TEST′;
SEGMENT_NAME 表大小MB
TEST 3.072
通過(guò)對(duì)上對(duì)TEST表進(jìn)行優(yōu)化處理后可以看到:(1) shrink縮表操作后TEST表的大小從5.632 MB縮小到3.072 MB,縮小了近一半,從而降低了表TEST的HWM值; (2)再次執(zhí)行全表掃描的查詢SQL:select * from test;查詢時(shí)間縮短為1 s,SQL執(zhí)行速度大大提高。
3.3 測(cè)試結(jié)論
在對(duì)高碎片表進(jìn)行全表掃描讀的訪問(wèn)方式時(shí),碎片增加了不必要的物理讀與內(nèi)存讀,也就增加了不必要的物理I/O與CPU的消耗,最終降低了對(duì)表數(shù)據(jù)的訪問(wèn)速度,即影響了SQL語(yǔ)句的響應(yīng)時(shí)間。通過(guò)shrink或者move操作對(duì)表碎片空間進(jìn)行重組,可以有效降低表中的HWM值,提高表的訪問(wèn)效率,進(jìn)而提高block的命中率,在一定程度上,可以起到系統(tǒng)優(yōu)化的作用。
本文針對(duì)HWM下碎片問(wèn)題對(duì)性能的影響,探討減少碎片空間的優(yōu)化策略,通過(guò)對(duì)碎片空間的重組來(lái)減少碎片的產(chǎn)生,以提高訪問(wèn)效率。
數(shù)據(jù)庫(kù)性能優(yōu)化是一項(xiàng)復(fù)雜的系統(tǒng)工程,是一個(gè)循序漸進(jìn)的過(guò)程,應(yīng)該針對(duì)Oracle運(yùn)行過(guò)程中出現(xiàn)的各種問(wèn)題,找出性能瓶頸,有針對(duì)性地對(duì)系統(tǒng)進(jìn)行調(diào)整,保證數(shù)據(jù)庫(kù)高效可靠的運(yùn)行。
參考文獻(xiàn)
[1] 高敬媛, 趙克寶.校園網(wǎng)數(shù)據(jù)庫(kù)性能優(yōu)化技術(shù)[J].煤炭技術(shù),2011,30(07):226-228.
[2] KYTE T, ORACLE E, Signature edition programming techniques and solutions for Oracle 7.3 through 8.1.7 (Expert One-On-One)[M]. New York: Apress,2010.
[3] KYTE T. Expert Oracle database architecture: 9i and 10g programming techniques and solutions[M]. 2006,San Bernardino: Macsource press,2006.