資源描述:
《淺談數(shù)據(jù)庫中sql語句優(yōu)化》由會員上傳分享,免費在線閱讀,更多相關內容在學術論文-天天文庫。
1、淺談數(shù)據(jù)庫中SQL語句優(yōu)化【摘要】查詢語句的效率不高對數(shù)據(jù)庫性能產(chǎn)生影響,為提升數(shù)據(jù)庫系統(tǒng)的性能,應就SQL語句實施合理的優(yōu)化,其實即為:把性能不高的SQL語句變?yōu)楣δ芤粯?、而性能?yōu)異的一種SQL語句,通過對優(yōu)化方法和技巧的研究提高SQL語句的效率,在一定程度上也就提高了查詢的效率?!娟P鍵詞】數(shù)據(jù)庫SQL語句的優(yōu)化設計、開發(fā)以及成品這些是數(shù)據(jù)庫系統(tǒng)的一個生命周期。對于設計環(huán)節(jié),針對數(shù)據(jù)庫性能實施優(yōu)化,花費最少、收益最高;但對于成品環(huán)節(jié),又就數(shù)據(jù)庫實施性能優(yōu)化,花費最多、但收益最低。針對數(shù)據(jù)庫性能優(yōu)化而言,一般能對硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)以及應用程序的優(yōu)化。對硬件進行升級即為
2、最普遍的優(yōu)化辦法,按照資料統(tǒng)計,可以看出,針對硬件、操作系統(tǒng)以及數(shù)據(jù)庫參數(shù)作出的優(yōu)化,得到的性能增加,全部加起來大概只提高40%左右,而60%的提升是來自對應用程序的優(yōu)化;很多優(yōu)化學者說,就應用程序實施優(yōu)化,能讓系統(tǒng)的性能增加80%。應用程序優(yōu)化一般包括二方面:源代碼以及SQL語句,源代碼的優(yōu)化因為牽涉到對程序邏輯的變更,對風險、時間與成本的要求非常高,但是就數(shù)據(jù)庫系統(tǒng)性能的增加收效不好;因此常常運用對SQL語句的優(yōu)化。一、優(yōu)化SQL語句的原因對于數(shù)據(jù)庫系統(tǒng),最基本、常用、繁雜的操作就是查詢,該操作在全部數(shù)據(jù)庫操作之中占到的比例最高。在數(shù)據(jù)庫系統(tǒng)累積達到某種程度,查詢之時要是
3、運用單條順序掃描,掃描一次全部的記錄會消耗掉幾十分鐘,有時更會幾個小時,進而,系統(tǒng)失去即實的使用價值。運用何種查詢策略,可以讓查詢時間變成幾秒、幾秒,如何更精確、簡便的得到查詢結果,就是要對SQL語句的優(yōu)化問題。查詢優(yōu)化為盡力找出和給定的表達式等價,同時執(zhí)行效率很好的表達式,某查詢通常存在多種實現(xiàn)方法,主要為怎樣找出和它等價、同時操作時間花費少的一種表迗式,查詢優(yōu)化關注的問題是怎樣省時、省空間以及效率高。優(yōu)化的核心問題是盡可能減少查詢中各表的參與加工的數(shù)據(jù)量,最終實現(xiàn)優(yōu)化空間與時間這一目的。首先,因為SQL語句為就數(shù)據(jù)庫實施操作的僅有途徑,其決定了數(shù)據(jù)庫系統(tǒng)的性能。其次,因為
4、SQL語句花費70%到90%的數(shù)據(jù)庫資源。第三,SQL語句因為和程序設計邏輯相獨立,就SQL語句實施優(yōu)化,影響不了程序邏輯。再次,SQL語句本身存在不一樣的寫法,而于性能上有著很大差異。最后,因為SQL語句學起來很簡單,然而精通較難。二、如何實施SQL語句優(yōu)化優(yōu)化SQL語句的方法主要通過重寫實施優(yōu)化,DBA、有時也是資深程序員會對SQL語句執(zhí)行計劃進行合理研究,根據(jù)經(jīng)驗,對SQL語句重寫,再就性能與結果作出對比,以便尋求到性能比較好的SQL語句。(一)在查詢Select語句中用Where子句限制返回的行數(shù),避免表掃描,若返回不必要的數(shù)據(jù),既浪費了服務器的I/O資源,又加重了網(wǎng)
5、絡的負擔降低性能。(二)在查詢時不要返回不需要的行、歹ij。(三)在IN后面值的列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)。(四)select中Where子句選擇所有合適的行,GroupBy用來分組統(tǒng)計行,Having子句用來剔除多余的分組。如果GroupBY的目的不包括計算,只是分組,那么用Distinct更快,Havin子句僅在聚集GroupBy子句收集行之后才施加限制,這樣導致全表掃描后再選擇,若可以使用Where子句來代替Having,則在掃描表的同時就進行了選擇,其查詢效率大大提高了。但是當Having子句用于聚集函數(shù)時不能由WHER
6、E代替時則必須使用Having。三、提升SQL語句的開發(fā)水平(一)WHERE后面的條件順序影響WHERE子句后面的條件順序對大數(shù)據(jù)量表的查詢會產(chǎn)生直接的影響。如:Select*fromzl_yhjbqkwheredy_dj=‘1KV以下andxh_bz=lSelect*fromzl_yhjbqkwherexh_bz=landdy_dj‘1KV以下’以上兩個SQL中dy_dj(電壓等級)及xh_bz(銷戶標志)兩個字段都沒進行索引,所以執(zhí)行的時候都是全表掃描,第一條SQL的dy_dj=‘1KV以下’條件在記錄集內比率為99%,而xh_bz=l的比率只為0.5%,在進行第一條SQ
7、L的時候99%條記錄都進行dy_dj及xh_bz的比較,而在進行第二條SQL的時候0.5%條記錄都進行dy_dj及xh_bz的比較,以此可以得出第二條SQL的CPU占用率明顯比第一條低。(二)查詢表順序的影響在FROM后面的表中的列表順序會對SQL執(zhí)行性能影響,在沒有索引及沒有對表進行統(tǒng)計分析的情況下,就會按表出現(xiàn)的順序進行鏈接,由此可見表的順序不對時會產(chǎn)生十分耗服務器資源的數(shù)據(jù)交叉。四、寫出專家級的SQL語句查詢優(yōu)化是關鍵的問題,其重點在于如何提高SQL的執(zhí)行效率,所以選擇什么樣的查詢語句是關鍵。進行