蔡 焰
(廣東韶關(guān)學(xué)院 圖書(shū)館,廣東 韶關(guān) 512005)
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è)試。
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。
高水標(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)性能。
對(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管理表空間有效。
具體命令操作如下:
對(duì)于碎片較多的表,可以通過(guò)shrink或move操作降低表中HWM高水位的值來(lái)進(jìn)行性能優(yōu)化。下面以shrink命令為例子進(jìn)行測(cè)試。
(1)表大小
(2)表的實(shí)際數(shù)據(jù)大?。?.439 MB
從以上的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。
通過(guò)shrink方式對(duì)表TEST作碎片重組實(shí)現(xiàn)對(duì)表的優(yōu)化處理。
通過(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í)行速度大大提高。
在對(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)行。
[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.