蔡 焰
(廣東韶關(guān)學(xué)院 圖書館,廣東 韶關(guān) 512005)
Web2.0與Web3.0的發(fā)展都離不開后臺支持?jǐn)?shù)據(jù)庫,數(shù)據(jù)庫運(yùn)行的好壞、快慢,直接影響到使用者的應(yīng)用,因而本文將重點(diǎn)研究信息資源建設(shè)中后臺數(shù)據(jù)庫的優(yōu)化策略。Oracle數(shù)據(jù)庫是具有高可靠性、高安全性、高兼容性的大型關(guān)系型數(shù)據(jù)庫,是信息化建設(shè)的重要基礎(chǔ)平臺。網(wǎng)絡(luò)中的信息資源數(shù)據(jù)庫具有異構(gòu)、數(shù)據(jù)量大、多媒體內(nèi)容多、查詢頻繁等特點(diǎn),伴隨網(wǎng)絡(luò)不斷深入的應(yīng)用,其存儲在數(shù)據(jù)庫中的數(shù)據(jù)量越來越多,而傳統(tǒng)的數(shù)據(jù)庫設(shè)計方法使得數(shù)據(jù)庫隨著訪問數(shù)據(jù)量的增大其性能明顯地降低[1]。Oracle的邏輯空間管理是Oracle管理和優(yōu)化的重要部分,ASSM段空間自動管理下的HWM問題對Oracle的存儲管理和性能優(yōu)化有重大影響。本文在探討Oracle 10g邏輯存儲管理的基礎(chǔ)上,針對HWM下的碎片問題提出了相關(guān)的優(yōu)化策略,并對其空間重組前后進(jìn)行了性能測試。
Oracle在邏輯存儲上分4個粒度,如圖1所示。
(1)Block(塊):粒度最小的存儲單位,標(biāo)準(zhǔn)默認(rèn)大小是8 KB,Oracle每一次I/O操作都是按Block來進(jìn)行的。
(2)Extent(區(qū)):由一系列相鄰的 Block組成,是 Oracle空間分配的基本單位[2],Oracle是以Extent為單位進(jìn)行擴(kuò)展的。
(3)Segment(段):由一系列的 Extents所組成[2],當(dāng)創(chuàng)建一個對象時(表或索引),就會分配一個 Segment給這個對象。
(4)Tablespace(表 空 間): 包 括 Segment、Extent和Block,Tablespace的數(shù)據(jù)物理上存儲在其所在的數(shù)據(jù)文件中,一個數(shù)據(jù)庫最少要有一個Tablespace。
高水標(biāo)記HWM(High-Water Mark)這個概念在Segment的存儲內(nèi)容中是比較重要的。簡單來說,HWM代表一個表使用的最大(top limit)塊(如圖 2所示),就是一個Segment中已使用和未來使用的Block的分界線[3]。圖2顯示了HWM首先位于新創(chuàng)建表的第一個塊中,隨著數(shù)據(jù)的插入和更新,使用了越來越多的塊,當(dāng)現(xiàn)有空間不足而進(jìn)行空間擴(kuò)展時HWM會隨之向上移。如果刪除一部分行數(shù)據(jù),可能會有許多塊不再包含數(shù)據(jù),但HWM不會往下移,被占用的最高空間稱為HWM。
Oracle在做全表掃描時會讀取HWM下的所有Blocks,即使其中不包含任何數(shù)據(jù),Oracle都會一一讀取,這會大大影響系統(tǒng)的性能,特別是當(dāng)HWM之下的大多數(shù)塊都為空時。
如果一個OLTP系統(tǒng)(即聯(lián)機(jī)事務(wù)處理,就是常說的關(guān)系數(shù)據(jù)庫,對記錄進(jìn)行增、刪、改、查)應(yīng)用頻繁地對某個表里的記錄進(jìn)行DML(Data Manipulation Language)操作(即數(shù)據(jù)操縱語言,一種命令使用戶能夠查詢數(shù)據(jù)庫以及操作已有數(shù)據(jù)庫中的數(shù)據(jù)的計算機(jī)語言),會造成Block中數(shù)據(jù)分布稀疏,導(dǎo)致HWM下存在大量的碎片,浪費(fèi)大量的空間。當(dāng)做全表掃描時,Oracle會讀取HWM之下的所有塊,即使其中不包含數(shù)據(jù)[3]。對于HWM以下表的碎片,做全表訪問時必然增加一致性讀,因而影響到響應(yīng)時間,降低系統(tǒng)性能。
對于增、刪、改操作比較頻繁的表,尤其是刪除操作比較頻繁的表,一般表的高水位HWM值會偏高,也就是表中數(shù)據(jù)塊碎片高,雖然ASSM的自動空間管理能提高DML操作并發(fā)訪問的性能,但是HWM下高碎片的產(chǎn)生會大大影響訪問效率,而減少碎片、降低對象的HWM可提高對象的訪問效率,從而達(dá)到性能優(yōu)化,大大提高數(shù)據(jù)的訪問效率。表對象可以通過shrink或move方法實現(xiàn)重組、減少碎片、降低HWM,進(jìn)行性能優(yōu)化;索引對象可以提供rebuild的方法來實現(xiàn)重組、減少碎片、降低HWM,進(jìn)行性能優(yōu)化。當(dāng)然,在對表及索引進(jìn)行shrink或move及rebuild操作時,最好選擇在非業(yè)務(wù)高峰時進(jìn)行,避免影響業(yè)務(wù)的正常運(yùn)轉(zhuǎn)。
shrink與move操作有一些不同,但都可以完成表中碎片的整理,在此可做一些比較:
(1)move的執(zhí)行效率比shrink高,因為shrink會產(chǎn)生 redo log、undo log;
(2)shrink對數(shù)據(jù)的移動是從后往前的,所以shrink不需要使用額外的空閑空間,而move是需要額外空閑空間的;
(3)對帶有索引的表進(jìn)行shrink操作時,索引是不需要重建的;而對帶有索引的表進(jìn)行move操作時,索引是需要rebuild重建的,否則索引不可用;
(4)對表進(jìn)行shrink操作時,必須打開表的行遷移屬性。
shrink和move都會對操作的表加表級獨(dú)占鎖,因此其他session對此表執(zhí)行 DML操作時,存在鎖等待;當(dāng)shrink或move操作執(zhí)行完成,鎖釋放。
索引的rebuild是可以在線完成的,比較適合在高可用環(huán)境下完成。
另外,shrink是10g的新特性,僅對ASSM管理表空間有效。
具體命令操作如下:
對于碎片較多的表,可以通過shrink或move操作降低表中HWM高水位的值來進(jìn)行性能優(yōu)化。下面以shrink命令為例子進(jìn)行測試。
(1)表大小
(2)表的實際數(shù)據(jù)大小:2.439 MB
從以上的SQL解釋計劃來看,SQL采用的是全表掃描讀的方式訪問,SQL將讀取表的高水位HWM以下的所有數(shù)據(jù)塊。
由上可知:(1)表TEST的大小為5.632 MB,但實際數(shù)據(jù)大小約為 2.439 MB,碎片率約為56.7%,表 TEST中存在大量的碎片;(2)查詢該表所有記錄所需要的時間為2 s。
通過shrink方式對表TEST作碎片重組實現(xiàn)對表的優(yōu)化處理。
通過對上對TEST表進(jìn)行優(yōu)化處理后可以看到:(1)shrink縮表操作后TEST表的大小從5.632 MB縮小到3.072 MB,縮小了近一半,從而降低了表TEST的HWM值;(2)再次執(zhí)行全表掃描的查詢SQL:select*from test;查詢時間縮短為1 s,SQL執(zhí)行速度大大提高。
在對高碎片表進(jìn)行全表掃描讀的訪問方式時,碎片增加了不必要的物理讀與內(nèi)存讀,也就增加了不必要的物理I/O與CPU的消耗,最終降低了對表數(shù)據(jù)的訪問速度,即影響了SQL語句的響應(yīng)時間。通過 shrink或者move操作對表碎片空間進(jìn)行重組,可以有效降低表中的HWM值,提高表的訪問效率,進(jìn)而提高block的命中率,在一定程度上,可以起到系統(tǒng)優(yōu)化的作用。
本文針對HWM下碎片問題對性能的影響,探討減少碎片空間的優(yōu)化策略,通過對碎片空間的重組來減少碎片的產(chǎn)生,以提高訪問效率。
數(shù)據(jù)庫性能優(yōu)化是一項復(fù)雜的系統(tǒng)工程,是一個循序漸進(jìn)的過程,應(yīng)該針對Oracle運(yùn)行過程中出現(xiàn)的各種問題,找出性能瓶頸,有針對性地對系統(tǒng)進(jìn)行調(diào)整,保證數(shù)據(jù)庫高效可靠的運(yùn)行。
[1]高敬媛,趙克寶.校園網(wǎng)數(shù)據(jù)庫性能優(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.