摘要:在數(shù)據(jù)庫系統(tǒng)中,最重要的一個考核的指標(biāo)是運行的速度,然而影響系統(tǒng)的運行速度及其對系統(tǒng)資源占用最多的一個因素是SQL語句的執(zhí)行,效能欠佳的SQL語句在執(zhí)行時能夠消耗系統(tǒng)資源的70-80%,如何提高系統(tǒng)的運行速度,SQL的性能優(yōu)化至關(guān)重要。本文首先從數(shù)據(jù)庫SQL著手,分析性能優(yōu)化的原理,提出采用的性能優(yōu)化措施。
關(guān)鍵詞:SQL優(yōu)化;優(yōu)化器
中圖分類號:TP311.138文獻標(biāo)識碼:A文章編號:1674-7712 (2014) 08-0000-01
一、數(shù)據(jù)庫中性能優(yōu)化的必要性
關(guān)于性能優(yōu)化,最簡單的理解就是為了保證系統(tǒng)準確率的情況下,用最快的速度及最短的時間來完成特定的任務(wù),而數(shù)據(jù)庫的性能優(yōu)化主要是通過對數(shù)據(jù)庫的索引程序、數(shù)據(jù)庫的語言、硬件等等進行必要的調(diào)試,從而對數(shù)據(jù)庫的每個部分進行必要的優(yōu)化處理,達到提高效率的目的。
在Oracle數(shù)據(jù)庫系統(tǒng)中,SQL語句的優(yōu)化至關(guān)重要,性能不佳的語句是影響系統(tǒng)的運行的關(guān)鍵因素之一。據(jù)不完全統(tǒng)計,大約有90%的性能出現(xiàn)問題主要是出在運用了不恰當(dāng)?shù)牟樵冋Z句而造成的。SQL語句易寫但不易寫好,程序設(shè)計人員有時只注重結(jié)果而對其性能確忽略了,往往會導(dǎo)致其系統(tǒng)的運行效率不理想。隨著數(shù)據(jù)庫的相關(guān)對象以及數(shù)據(jù)量的改變,需要對SQL語句進行不斷的效能調(diào)整。對海量的數(shù)據(jù)而言,優(yōu)質(zhì)SQL語句與劣質(zhì)語句間的速度差別能夠達到百倍以上,或者更多,特別對復(fù)雜的或大型的數(shù)據(jù)庫更明顯。如何優(yōu)化SQL語句,提高系統(tǒng)的運行速度,成為有關(guān)程序研究員較為關(guān)心的問題之一。
二、SQL語句優(yōu)化的方法
(一)Oracle優(yōu)化器
Oracle優(yōu)化器是SQL處理的核心,目前支持兩種優(yōu)化器:基本規(guī)則的RBO、基于成本的CBO、選擇性CHOOSE優(yōu)化器。為了避免進行掃描全表,可以直接使用基于成本的優(yōu)化器及基本規(guī)則的優(yōu)化品,盡量不要使用CHOOSE優(yōu)化器。
1.基于規(guī)則的RBO優(yōu)化器
表1RBO路徑等級表
基于規(guī)則的RBO優(yōu)化器,主要是采用規(guī)則或者啟發(fā)的方法來生成執(zhí)行計劃。在RBO中,如果有索引則將其與該優(yōu)化程序一起用。表1是RBO路徑等級,等級高的效率低,耗費時間多,等級低的效率高,耗費的時間也就少。對一段SQL的語句,按表1中15年級別進行對每個句子打分,得分最少的其方案則最優(yōu)。
2.基于成本的CBO優(yōu)化器
基于成本的CBO優(yōu)化器主要是把一個引擎集成到數(shù)據(jù)庫的內(nèi)核中,對每一個執(zhí)行計劃需要的成本進行估計,對耗費資源進行量化,根據(jù)成本選出成本最少的作為最優(yōu)路徑。在耗費資源中,一個查詢分成3部分:CPU成本、I/O成本及Network成本。
3.CHOOSE優(yōu)化器
在缺省情況下,ORACLE采用CHOOSE優(yōu)化器。
(二)共享SQL語句
對SQL語句解析是比較費系統(tǒng)資源的,將會導(dǎo)致其性能下降,為了對SQL語句不重復(fù)的進行解析,可以利用SGA(系統(tǒng)全局區(qū)域)將SQL語句進行存儲,實現(xiàn)用戶共享。比如一個SQL語句第一次被解析后,Oracle將結(jié)果放在SGA共享池中,如果第二次被執(zhí)行時,就不用再對此語句進行分析,直接從共享池中獲取本語句的執(zhí)行路徑。這樣Oracle便在很大程度上提高了SQL的執(zhí)行的性能,并且能夠大大的節(jié)省內(nèi)存的使用。
要實現(xiàn)共享SQL語句,必須是當(dāng)前要執(zhí)行的語句與共享池中的語句要完全相同,如果參數(shù)不同、變量不同、空格數(shù)不同、出現(xiàn)大小寫不一致都將不匹配,不能實現(xiàn)共享。
(三)優(yōu)化SQL語句索引
提高數(shù)據(jù)庫運行效率最重要的因素是利用好索引。索引能夠提供快速訪問rod_id,這樣能夠?qū)崿F(xiàn)提升效率,特別是對大型表的索引效率會明顯提升。但如果索引使用的不當(dāng),會造成事倍功半的效果,因此優(yōu)化SQL語句索引特別重要,如何創(chuàng)建索引及使用索引,應(yīng)該注意以下幾點:(1)在where中出現(xiàn)頻繁的列上建立索引;(2)頻繁操作的order by或group by操作的列上建立索引;(3)盡量不在要重復(fù)率高的字段上建立索引;(4)對于小于5M的表,就不要使用索引;(5)多列進行排序的,可建立復(fù)合索引在列上,但盡量少用復(fù)合索引;(6)不同值較少的列上盡量不要那間索引;(7)對數(shù)據(jù)記錄進行大批量的操作(如delete、insert),最好將索引先刪除,進行數(shù)據(jù)操作后再重新建立必要的索引;(8)數(shù)據(jù)類型要注意匹配;(9)對于操作符的使用,要避免使用!=或<>等,這樣會造成系統(tǒng)無法用索引,而是直接從表中搜索數(shù)據(jù)
(四)執(zhí)行計劃
在執(zhí)行程序時,每執(zhí)行一個語句前,Oracle都將會生成一個查詢執(zhí)行計劃,該計劃決定了SQL語句將如何執(zhí)行。在語句執(zhí)行之前,計劃在生成的過程當(dāng)中采用了不同信息,如對象的尺寸、優(yōu)化器模式、索引存在、儲存概要的存在、HINT的出現(xiàn)、生成的統(tǒng)計量等等
三、結(jié)束語
ORACLE數(shù)據(jù)庫是一個很復(fù)雜的軟件,它的可調(diào)性很強。SQL語句優(yōu)化是提高數(shù)據(jù)庫運行速度的關(guān)鍵因素,隨著數(shù)據(jù)庫系統(tǒng)的應(yīng)用及數(shù)據(jù)量的不斷變化,所采用的優(yōu)化策略也應(yīng)隨著調(diào)整。對于SQL的優(yōu)化涉及到多個方方面面,在設(shè)計過程中要針對不同的場景采用不同的方法,開發(fā)人員、數(shù)據(jù)庫的管理人員及應(yīng)用程序設(shè)計人員應(yīng)該不斷的對SQL語句執(zhí)行的計劃進行分析,對SQL語句的性能及結(jié)果進行比較,找到性能較好的語句及執(zhí)行計劃,從而改善ORACLE數(shù)據(jù)庫的運行的性能。
參考文獻:
[1]張桂燕.基于數(shù)據(jù)庫的語句優(yōu)化經(jīng)驗之談[J].電腦知識與技術(shù),2011(17).
[作者簡介]劉明信(1960.03-),高級工程師,學(xué)士學(xué)位,研究方向:數(shù)據(jù)庫。