據(jù)統(tǒng)計(jì)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的性能問(wèn)題50%的情況下都是由于設(shè)計(jì)問(wèn)題引起的。軟件設(shè)計(jì)師在設(shè)計(jì)軟件和數(shù)據(jù)庫(kù)結(jié)構(gòu)時(shí),未必能完全知道將來(lái)用戶使用系統(tǒng)處理業(yè)務(wù)的各種復(fù)雜情況。這就造成在軟件系統(tǒng)運(yùn)行初始階段只能發(fā)現(xiàn)個(gè)別的性能問(wèn)題,而其他的性能問(wèn)題只能等到系統(tǒng)運(yùn)行一段時(shí)間后才能暴露出來(lái)。針對(duì)這些問(wèn)題,我們提出數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)性能設(shè)計(jì)優(yōu)化策略,以提高數(shù)據(jù)應(yīng)用子系統(tǒng)的性能。
摘要:Oracle數(shù)據(jù)庫(kù)作為目前適用性最好的關(guān)系數(shù)據(jù)庫(kù)引擎之一,能夠支持各種業(yè)務(wù)形式、處理各種復(fù)雜事務(wù),得到極為廣泛的應(yīng)用。
關(guān)鍵詞:數(shù)據(jù)庫(kù)性能優(yōu)化,逆規(guī)范化設(shè)計(jì),優(yōu)化策略
1對(duì)數(shù)據(jù)庫(kù)服務(wù)器內(nèi)存分配的調(diào)整
由于對(duì)服務(wù)器內(nèi)存參數(shù)的調(diào)整對(duì)oracle的性能影響顯著,它成為Oracle數(shù)據(jù)庫(kù)性能調(diào)優(yōu)的首選對(duì)象。服務(wù)器內(nèi)存參數(shù)的調(diào)整主要是對(duì)數(shù)據(jù)庫(kù)系統(tǒng)全局區(qū)的調(diào)整,系統(tǒng)全局區(qū)包括共享池、數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)。其中最主要的是對(duì)數(shù)據(jù)緩沖區(qū)和共享池的參數(shù)調(diào)整。
數(shù)據(jù)庫(kù)緩沖區(qū)的作用主要是將從磁盤(pán)中讀取的數(shù)據(jù)塊存放在內(nèi)存緩存中,從這個(gè)意義上說(shuō)數(shù)據(jù)庫(kù)緩沖區(qū)越大,存放的共享數(shù)據(jù)就越多,減少了對(duì)磁盤(pán)數(shù)據(jù)的物理讀操作,也就提高了系統(tǒng)的響應(yīng)速度。
2Sql優(yōu)化
。1)在基于規(guī)則的優(yōu)化器中,Oracle對(duì)from子句中的表名是按照從右到左的順序進(jìn)行解析的,即:From子句中排在最后的表會(huì)被首先處理。我們把這張表稱做驅(qū)動(dòng)表。當(dāng)from字句中包含多個(gè)標(biāo)的情況下,oracle是通過(guò)排序合并的方式連接這些表的,為了提高oracle的執(zhí)行效率,應(yīng)當(dāng)選擇包含記錄條數(shù)少的表作為驅(qū)動(dòng)表,即放在from子句的最后。當(dāng)from子句中有3張以上的表進(jìn)行連接查詢時(shí),需要將連接其他表的交叉表作為驅(qū)動(dòng)表。
。2)在oracle語(yǔ)句中,where子句的執(zhí)行順序是自下而上的對(duì)語(yǔ)句進(jìn)行解析的。為了提高sql語(yǔ)句的執(zhí)行效率,應(yīng)該將能過(guò)濾掉大量數(shù)據(jù)的條件寫(xiě)在where子句的最后。
。3)在selcect語(yǔ)句中使用*雖然對(duì)編程人員簡(jiǎn)單方便,oracle會(huì)自動(dòng)列出所有列名,但oracle解析*時(shí)則是通過(guò)查詢數(shù)據(jù)字典來(lái)完成對(duì)*的轉(zhuǎn)換的,這樣耗費(fèi)了更多的時(shí)間用來(lái)查詢數(shù)據(jù)字典,轉(zhuǎn)換,必然降低執(zhí)行效率,因此在selcect語(yǔ)句中應(yīng)當(dāng)直接列出所有的列名。
(4)用where子句代替having子句,在where子句中排除不需要的記錄,這樣的執(zhí)行效率將遠(yuǎn)遠(yuǎn)高于執(zhí)行完成之后用having子句對(duì)記錄進(jìn)行篩選。
總體來(lái)說(shuō),Oracle數(shù)據(jù)庫(kù)的性能優(yōu)化涉及的方面很廣,是一個(gè)系統(tǒng)工程,需要在系統(tǒng)設(shè)計(jì)運(yùn)行的過(guò)程中,不斷運(yùn)用以上提到的各個(gè)方面,對(duì)Oracle數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行優(yōu)化,以確保數(shù)據(jù)庫(kù)的使用效率。數(shù)據(jù)庫(kù)的性能變差,往往不是一個(gè)方面的問(wèn)題,而是各種問(wèn)題相互結(jié)合導(dǎo)致的,因此,需要對(duì)各種因素綜合分析,對(duì)各種優(yōu)化手段綜合應(yīng)用,才能做到將數(shù)據(jù)庫(kù)的性能維持在一個(gè)比較好的水平。
3軟件開(kāi)發(fā)模式優(yōu)化策略
3.1避免訪問(wèn)回滾段
如果查詢數(shù)據(jù)庫(kù)時(shí),要訪問(wèn)的數(shù)據(jù)正被另外用戶修改,數(shù)據(jù)庫(kù)為了維護(hù)讀一致性,需要訪問(wèn)會(huì)滾段來(lái)讀取查詢語(yǔ)句執(zhí)行時(shí)刻的數(shù)據(jù)值。如果應(yīng)用程序需要經(jīng)常讀取正在被其它用戶修改的數(shù)據(jù),數(shù)據(jù)庫(kù)系統(tǒng)為了得到一個(gè)數(shù)據(jù),不得不多次訪問(wèn)磁盤(pán)。數(shù)據(jù)庫(kù)管理員可通過(guò)配置回滾段來(lái)減少查詢時(shí)“snapshottooold”錯(cuò)誤的發(fā)生。解決這個(gè)問(wèn)題的根本方法還是需要重新修改應(yīng)用程序設(shè)計(jì),合理對(duì)事務(wù)進(jìn)行劃分。
3.2表的分區(qū)和并行技術(shù)
如果必須要在數(shù)據(jù)庫(kù)運(yùn)行特別耗時(shí)的操作。應(yīng)盡量地把這樣的操作分解,嚴(yán)格限制操作所涉及的記錄數(shù),并設(shè)法使操作并行,充分地提高執(zhí)行效率。
(1)使用分區(qū)。分區(qū)技術(shù)有兩個(gè)潛在的好處:提高查詢性能和提高數(shù)據(jù)庫(kù)可用性。數(shù)據(jù)庫(kù)查詢時(shí),優(yōu)化器知道那些分區(qū)包含查詢所要的數(shù)據(jù)。而其它分區(qū)數(shù)據(jù)將不會(huì)被讀取,從而查詢?nèi)蝿?wù)將更快完成。許多管理工作可在只一個(gè)分區(qū)上進(jìn)行,而不影響其它分區(qū)的數(shù)據(jù)。例如可以選擇只刪除一個(gè)表分區(qū)中的數(shù)據(jù)。可對(duì)表分區(qū)進(jìn)行再分割,把一個(gè)表分區(qū)遷移到不同的表空間上。可只對(duì)一個(gè)表分區(qū)進(jìn)行分析統(tǒng)計(jì)。表分區(qū)的這些特性。
(2)使用并行。Oracle數(shù)據(jù)庫(kù)中幾乎所有的操作都支持并行特性,包括查詢、插入、和數(shù)據(jù)加載。并行選項(xiàng)可以使多個(gè)處理器同時(shí)處理一條命令,在創(chuàng)建庫(kù)數(shù)據(jù)庫(kù)對(duì)象時(shí)可以設(shè)定并行參數(shù),也可在查詢語(yǔ)句中重新設(shè)。
4軟件測(cè)試優(yōu)化策略
。1)用大量的數(shù)據(jù)進(jìn)行測(cè)試。系統(tǒng)使用一段時(shí)間后,數(shù)據(jù)庫(kù)的性能會(huì)發(fā)生變化。例如oracle數(shù)據(jù)庫(kù)一個(gè)表的pctfree和pctused參數(shù)設(shè)置可能會(huì)使數(shù)據(jù)塊只有一半的空間被利用或使數(shù)據(jù)庫(kù)記錄鏈接(chained)。上面的情形都會(huì)引起數(shù)據(jù)庫(kù)性能問(wèn)題,且只有在應(yīng)用程序使用了一段時(shí)間后才能被發(fā)現(xiàn)。還有一個(gè)例子就是B_樹(shù)索引,隨著數(shù)據(jù)的增加,索引會(huì)在中心點(diǎn)分裂開(kāi)來(lái),索引樹(shù)次將增加新的層次,這將會(huì)給數(shù)據(jù)添加造成負(fù)面影響。可以把B-樹(shù)看成樹(shù),樹(shù)中的某些節(jié)點(diǎn)被存放在RAM中,某些則不是。通常來(lái)說(shuō)。根節(jié)點(diǎn)會(huì)被存放在RAM中,葉節(jié)點(diǎn)則不是。事實(shí)上,離根越遠(yuǎn)的節(jié)點(diǎn)越不可能被存放在RAM中。搜索數(shù)據(jù)時(shí)(正如通過(guò)索引訪問(wèn)數(shù)據(jù)),對(duì)磁盤(pán)二級(jí)存儲(chǔ)的一次訪問(wèn)至少要花費(fèi)幾個(gè)毫秒,所以一個(gè)數(shù)據(jù)結(jié)構(gòu)的性能,高度依賴于從根到葉的路徑上平均節(jié)點(diǎn)個(gè)數(shù)[6]:這個(gè)數(shù)目在B一樹(shù)中叫做層次數(shù)。這也只有索引分裂后,才會(huì)看出影響。應(yīng)用程序正常工作了一兩周的時(shí)間,數(shù)據(jù)規(guī)模達(dá)到一個(gè)臨界值后,突然性能下降,不能滿足業(yè)務(wù)需要了。
(2)足夠多的用戶并發(fā)測(cè)試。只有一個(gè)測(cè)試用戶大多數(shù)情況下不能反映軟件真實(shí)使用情況下的負(fù)載情況。我們必須測(cè)試在多個(gè)并發(fā)用戶情況下是否會(huì)引起死鎖(deadlock)以及性能下降等問(wèn)題。例如兩個(gè)軟件模塊以同樣地方式向一個(gè)表中插入記錄,并查詢?cè)摫淼臄?shù)據(jù)。如果這兩個(gè)模塊被同時(shí)使用,這就會(huì)引起數(shù)據(jù)不一致的問(wèn)題。只有經(jīng)過(guò)多個(gè)用戶的同時(shí)操作軟件的測(cè)試,這樣的問(wèn)題才可能被發(fā)現(xiàn)。
5結(jié)語(yǔ)
數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的性能優(yōu)化遠(yuǎn)不是按照廠家所列的有關(guān)指南通過(guò)短短的幾步就可以達(dá)到的。要想獲得最大的優(yōu)化效果,既需要具有廣泛而深人的數(shù)據(jù)庫(kù)原理和系統(tǒng)實(shí)踐知識(shí),又要有扎實(shí)的應(yīng)用程序設(shè)計(jì)能力,同時(shí)要充分熟悉操作系統(tǒng)和有關(guān)的軟硬件環(huán)境。筆者在實(shí)際工作中利用這些策略參與了數(shù)個(gè)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)設(shè)計(jì),這些系統(tǒng)都表現(xiàn)出了良好的運(yùn)行性能。
參考文獻(xiàn)
[1]GajaKrishnaVaidyanatha.Oracle性能優(yōu)化技術(shù)內(nèi)幕.機(jī)械工業(yè)出版社,2002,5:284.
[2]李愛(ài)武.Oracle數(shù)據(jù)庫(kù)系統(tǒng)原理.北京郵電大學(xué)出版社,2007-3-1:210.
轉(zhuǎn)載請(qǐng)注明來(lái)自:http://www.jinnzone.com/jisuanjiyingyonglw/30862.html