【摘 要】查詢語(yǔ)句的效率不高對(duì)數(shù)據(jù)庫(kù)性能產(chǎn)生影響,為提升數(shù)據(jù)庫(kù)系統(tǒng)的性能,應(yīng)就SQL語(yǔ)句實(shí)施合理的優(yōu)化,其實(shí)即為:把性能不高的SQL語(yǔ)句變?yōu)楣δ芤粯?、而性能?yōu)異的一種SQL語(yǔ)句,通過(guò)對(duì)優(yōu)化方法和技巧的研究提高SQL語(yǔ)句的效率,在一定程度上也就提高了查詢的效率。
【關(guān)鍵詞】數(shù)據(jù)庫(kù) SQL 語(yǔ)句的優(yōu)化
設(shè)計(jì)、開(kāi)發(fā)以及成品這些是數(shù)據(jù)庫(kù)系統(tǒng)的一個(gè)生命周期。對(duì)于設(shè)計(jì)環(huán)節(jié),針對(duì)數(shù)據(jù)庫(kù)性能實(shí)施優(yōu)化,花費(fèi)最少、收益最高;但對(duì)于成品環(huán)節(jié),又就數(shù)據(jù)庫(kù)實(shí)施性能優(yōu)化,花費(fèi)最多、但收益最低。針對(duì)數(shù)據(jù)庫(kù)性能優(yōu)化而言,一般能對(duì)硬件、操作系統(tǒng)、數(shù)據(jù)庫(kù)參數(shù)以及應(yīng)用程序的優(yōu)化。對(duì)硬件進(jìn)行升級(jí)即為最普遍的優(yōu)化辦法,按照資料統(tǒng)計(jì),可以看出,針對(duì)硬件、操作系統(tǒng)以及數(shù)據(jù)庫(kù)參數(shù)作出的優(yōu)化,得到的性能增加,全部加起來(lái)大概只提高40%左右,而60%的提升是來(lái)自對(duì)應(yīng)用程序的優(yōu)化;很多優(yōu)化學(xué)者說(shuō),就應(yīng)用程序?qū)嵤﹥?yōu)化,能讓系統(tǒng)的性能增加80%。應(yīng)用程序優(yōu)化一般包括二方面:源代碼以及SQL語(yǔ)句,源代碼的優(yōu)化因?yàn)闋可娴綄?duì)程序邏輯的變更,對(duì)風(fēng)險(xiǎn)、時(shí)間與成本的要求非常高,但是就數(shù)據(jù)庫(kù)系統(tǒng)性能的增加收效不好;因此常常運(yùn)用對(duì)SQL語(yǔ)句的優(yōu)化。
一、優(yōu)化SQL語(yǔ)句的原因
對(duì)于數(shù)據(jù)庫(kù)系統(tǒng),最基本、常用、繁雜的操作就是查詢,該操作在全部數(shù)據(jù)庫(kù)操作之中占到的比例最高。在數(shù)據(jù)庫(kù)系統(tǒng)累積達(dá)到某種程度,查詢之時(shí)要是運(yùn)用單條順序掃描,掃描一次全部的記錄會(huì)消耗掉幾十分鐘,有時(shí)更會(huì)幾個(gè)小時(shí),進(jìn)而,系統(tǒng)失去即實(shí)的使用價(jià)值。運(yùn)用何種查詢策略,可以讓查詢時(shí)間變成幾秒、幾秒,如何更精確、簡(jiǎn)便的得到查詢結(jié)果,就是要對(duì)SQL語(yǔ)句的優(yōu)化問(wèn)題。
查詢優(yōu)化為盡力找出和給定的表達(dá)式等價(jià),同時(shí)執(zhí)行效率很好的表達(dá)式,某查詢通常存在多種實(shí)現(xiàn)方法,主要為怎樣找出和它等價(jià)、同時(shí)操作時(shí)間花費(fèi)少的一種表達(dá)式,查詢優(yōu)化關(guān)注的問(wèn)題是怎樣省時(shí)、省空間以及效率高。優(yōu)化的核心問(wèn)題是盡可能減少查詢中各表的參與加工的數(shù)據(jù)量,最終實(shí)現(xiàn)優(yōu)化空間與時(shí)間這一目的。
首先,因?yàn)镾QL語(yǔ)句為就數(shù)據(jù)庫(kù)實(shí)施操作的僅有途徑,其決定了數(shù)據(jù)庫(kù)系統(tǒng)的性能。
其次,因?yàn)镾QL語(yǔ)句花費(fèi)70%到90%的數(shù)據(jù)庫(kù)資源。
第三,SQL語(yǔ)句因?yàn)楹统绦蛟O(shè)計(jì)邏輯相獨(dú)立,就SQL語(yǔ)句實(shí)施優(yōu)化,影響不了程序邏輯。
再次,SQL語(yǔ)句本身存在不一樣的寫(xiě)法,而于性能上有著很大差異。
最后,因?yàn)镾QL語(yǔ)句學(xué)起來(lái)很簡(jiǎn)單,然而精通較難。
二、如何實(shí)施SQL語(yǔ)句優(yōu)化
優(yōu)化SQL語(yǔ)句的方法主要通過(guò)重寫(xiě)實(shí)施優(yōu)化,DBA、有時(shí)也是資深程序員會(huì)對(duì)SQL語(yǔ)句執(zhí)行計(jì)劃進(jìn)行合理研究,根據(jù)經(jīng)驗(yàn),對(duì)SQL語(yǔ)句重寫(xiě),再就性能與結(jié)果作出對(duì)比,以便尋求到性能比較好的SQL語(yǔ)句。
(一)在查詢Select語(yǔ)句中用Where子句限制返回的行數(shù),避免表掃描,若返回不必要的數(shù)據(jù),既浪費(fèi)了服務(wù)器的I/O資源,又加重了網(wǎng)絡(luò)的負(fù)擔(dān)降低性能。
(二)在查詢時(shí)不要返回不需要的行、列。
(三)在IN后面值的列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)。
(四)select中Where子句選擇所有合適的行,Group By用來(lái)分組統(tǒng)計(jì)行,Having子句用來(lái)剔除多余的分組。如果Group BY的目的不包括計(jì)算,只是分組,那么用Distinct更快,Havin子句僅在聚集 Group By子句收集行之后才施加限制,這樣導(dǎo)致全表掃描后再選擇,若可以使用Where子句來(lái)代替 Having,則在掃描表的同時(shí)就進(jìn)行了選擇,其查詢效率大大提高了。但是當(dāng)Having子句用于聚集函數(shù)時(shí)不能由WHERE代替時(shí)則必須使用Having。
三、提升SQL語(yǔ)句的開(kāi)發(fā)水平
(一)WHERE后面的條件順序影響
WHERE子句后面的條件順序?qū)Υ髷?shù)據(jù)量表的查詢會(huì)產(chǎn)生直接的影響。如:
Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
以上兩個(gè)SQL中dy_dj(電壓等級(jí))及xh_bz(銷(xiāo)戶標(biāo)志)兩個(gè)字段都沒(méi)進(jìn)行索引,所以執(zhí)行的時(shí)候都是全表掃描,第一條SQL的dy_dj = '1KV以下'條件在記錄集內(nèi)比率為99%,而xh_bz=1的比率只為0.5%,在進(jìn)行第一條SQL的時(shí)候99%條記錄都進(jìn)行dy_dj及xh_bz的比較,而在進(jìn)行第二條SQL的時(shí)候0.5%條記錄都進(jìn)行dy_dj及xh_bz的比較,以此可以得出第二條SQL的CPU占用率明顯比第一條低。
(二)查詢表順序的影響
在FROM后面的表中的列表順序會(huì)對(duì)SQL執(zhí)行性能影響,在沒(méi)有索引及沒(méi)有對(duì)表進(jìn)行統(tǒng)計(jì)分析的情況下,就會(huì)按表出現(xiàn)的順序進(jìn)行鏈接,由此可見(jiàn)表的順序不對(duì)時(shí)會(huì)產(chǎn)生十分耗服務(wù)器資源的數(shù)據(jù)交叉。
四、寫(xiě)出專家級(jí)的SQL語(yǔ)句
查詢優(yōu)化是關(guān)鍵的問(wèn)題,其重點(diǎn)在于如何提高 SQL 的執(zhí)行效率,所以選擇什么樣的查詢語(yǔ)句是關(guān)鍵。進(jìn)行數(shù)據(jù)庫(kù)開(kāi)發(fā)及其維護(hù)的時(shí)候,查詢的優(yōu)化能夠提升系統(tǒng)的性能,針對(duì)很大數(shù)據(jù)量的數(shù)據(jù)庫(kù)系統(tǒng)而言,顯得更加重要。
寫(xiě)SQL語(yǔ)句時(shí)更主要的是理解優(yōu)化的目的,所有的數(shù)據(jù)庫(kù)優(yōu)化就是一個(gè)原則,盡量少的邏輯讀,盡量少的占內(nèi)存,所以那些優(yōu)化的細(xì)節(jié)并不是主要的,而是如何從運(yùn)行的系統(tǒng)迅速定位問(wèn)題,如果從SQL設(shè)計(jì)初期避免問(wèn)題才是關(guān)鍵,它就能幫用戶找到最佳的寫(xiě)法。
參考文獻(xiàn) :
[1]張孔倚.關(guān)于人工智能技術(shù)在情報(bào)檢索中的應(yīng)用.山西大學(xué)學(xué)報(bào),2007(3)
[2]李明,沈紅君.情報(bào)檢索智能化.情報(bào)理論與實(shí)踐,2005(6)
[3]涂序彥.人工智能及其應(yīng)用.北京:清華大學(xué)出版社,2006。