在數(shù)據(jù)庫應(yīng)用系統(tǒng)中編寫可執(zhí)行的sql語句可以有多種方式實(shí)現(xiàn),但哪一條是最佳方案卻難以確定。為了解決這一問題,有必要對(duì)sql實(shí)施優(yōu)化。簡單地說,sql語句的優(yōu)化就是將性能低下的sql語句轉(zhuǎn)換成達(dá)到同樣目的的性能更好的sql語句。
優(yōu)化sql語句的原因
數(shù)據(jù)庫系統(tǒng)的生命周期可以分成: 設(shè)計(jì)、開發(fā)和成品三個(gè)階段。在設(shè)計(jì)階段進(jìn)行優(yōu)化的成本最低,收益最大。在成品階段進(jìn)行優(yōu)化的成本最高,收益最小。如果將一個(gè)數(shù)據(jù)庫系統(tǒng)比喻成一座樓房,在樓房建好后進(jìn)行矯正往往成本很高而收效很小(甚至可能根本無法矯正),而在樓房設(shè)計(jì)、生產(chǎn)階段控制好每塊磚瓦的質(zhì)量就能達(dá)到花費(fèi)小而見效高的目的。
為了獲得最大效益,人們常需要對(duì)數(shù)據(jù)庫進(jìn)行優(yōu)化。數(shù)據(jù)庫的優(yōu)化通常可以通過對(duì)網(wǎng)絡(luò)、硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)和應(yīng)用程序的優(yōu)化來進(jìn)行。根據(jù)統(tǒng)計(jì),對(duì)網(wǎng)絡(luò)、硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)進(jìn)行優(yōu)化所獲得的性能提升全部加起來只占數(shù)據(jù)庫應(yīng)用系統(tǒng)性能提升的40%左右,其余60%的系統(tǒng)性能提升全部來自對(duì)應(yīng)用程序的優(yōu)化。許多優(yōu)化專家甚至認(rèn)為對(duì)應(yīng)用程序的優(yōu)化可以得到80%的系統(tǒng)性能提升。因此可以肯定,通過優(yōu)化應(yīng)用程序來對(duì)數(shù)據(jù)庫系統(tǒng)進(jìn)行優(yōu)化能獲得更大的收益。
對(duì)應(yīng)用程序的優(yōu)化通常可分為兩個(gè)方面: 源代碼的優(yōu)化和sql語句的優(yōu)化。由于涉及到對(duì)程序邏輯的改變,源代碼的優(yōu)化在時(shí)間成本和風(fēng)險(xiǎn)上代價(jià)很高(尤其是對(duì)正在使用中的系統(tǒng)進(jìn)行優(yōu)化) 。另一方面,源代碼的優(yōu)化對(duì)數(shù)據(jù)庫系統(tǒng)性能的提升收效有限,因?yàn)閼?yīng)用程序?qū)?shù)據(jù)庫的操作最終要表現(xiàn)為sql語句對(duì)數(shù)據(jù)庫的操作。
對(duì)sql語句進(jìn)行優(yōu)化有以下一些直接原因:
1. sql語句是對(duì)數(shù)據(jù)庫(數(shù)據(jù)) 進(jìn)行操作的惟一途徑,應(yīng)用程序的執(zhí)行最終要?dú)w結(jié)為sql語句的執(zhí)行,sql語句的效率對(duì)數(shù)據(jù)庫系統(tǒng)的性能起到了決定性的作用。
2. sql語句消耗了70%~90%的數(shù)據(jù)庫資源。
3. sql語句獨(dú)立于程序設(shè)計(jì)邏輯,對(duì)sql語句進(jìn)行優(yōu)化不會(huì)影響程序邏輯,相對(duì)于對(duì)程序源代碼的優(yōu)化,對(duì)sql語句的優(yōu)化在時(shí)間成本和風(fēng)險(xiǎn)上的代價(jià)都很低。
4. sql語句可以有不同的寫法,不同的寫法在性能上的差異可能很大。
5. sql語句易學(xué),難精通。sql語句的性能往往同實(shí)際運(yùn)行系統(tǒng)的數(shù)據(jù)庫結(jié)構(gòu)、記錄數(shù)量等有關(guān),不存在普遍適用的規(guī)律來提升性能。
傳統(tǒng)的優(yōu)化方法
sql程序人員在傳統(tǒng)上采用手工重寫來對(duì)sql語句進(jìn)行優(yōu)化。這主要依靠dba或資深程序員對(duì)sql語句執(zhí)行計(jì)劃的分析,依靠經(jīng)驗(yàn),嘗試重寫sql語句,然后對(duì)結(jié)果和性能進(jìn)行比較以試圖找到性能較佳的sql語句。這種做法存在著以下不足:
1. 無法找出sql語句的所有可能寫法。很可能花費(fèi)了大量的時(shí)間也無法找到性能較佳的sql語句。即便找到了某個(gè)性能較佳的sql語句也無法知道是否存在性能更好的寫法。
2. 非常依賴于人的經(jīng)驗(yàn),經(jīng)驗(yàn)的多寡往往決定了優(yōu)化后sql語句的性能。
3. 非常耗時(shí)間。重寫-->校驗(yàn)正確性-->比較性能,這一循環(huán)過程需要大量的時(shí)間。
根據(jù)傳統(tǒng)的sql優(yōu)化工具的功能,人們一般將優(yōu)化工具分為以下三代產(chǎn)品:
第一代的sql優(yōu)化工具是執(zhí)行計(jì)劃分析工具。這類工具對(duì)輸入的sql語句從數(shù)據(jù)庫提取執(zhí)行計(jì)劃,并解釋執(zhí)行計(jì)劃中關(guān)鍵字的含義。
第二代的sql優(yōu)化工具只能提供增加索引的建議,它通過對(duì)輸入的sql語句的執(zhí)行計(jì)劃的分析來產(chǎn)生是否要增加索引的建議。這類工具存在著致命的缺點(diǎn)——只分析了一條sql語句就得出增加某個(gè)索引的結(jié)論,根本不理會(huì)(實(shí)際上也無法評(píng)估到)增加的索引對(duì)整體數(shù)據(jù)庫系統(tǒng)性能的影響。
第三代工具是利用人工智能實(shí)現(xiàn)自動(dòng)sql優(yōu)化。
人工智能自動(dòng)sql優(yōu)化
隨著人工智能技術(shù)的發(fā)展和在數(shù)據(jù)庫優(yōu)化領(lǐng)域應(yīng)用的深入,在20世紀(jì)90年代末優(yōu)化技術(shù)取得了突破性的進(jìn)展,出現(xiàn)了人工智能自動(dòng)sql優(yōu)化。人工智能自動(dòng)sql優(yōu)化的本質(zhì)就是借助人工智能技術(shù),自動(dòng)對(duì)sql語句進(jìn)行重寫,找到性能最好的等效sql語句。lecco sql expert就采用了這種人工智能技術(shù),其sql expert支持oracle、sybase、ms sql server和ibm db2數(shù)據(jù)庫平臺(tái)。其突出特點(diǎn)是自動(dòng)優(yōu)化sql語句。除此以外,還可以以人工智能知識(shí)庫“反饋式搜索引擎”來重寫sql語句,并找出所有等效的sql語句及可能的執(zhí)行計(jì)劃,通過測試運(yùn)行為應(yīng)用程序和數(shù)據(jù)庫自動(dòng)找到性能最好的sql語句,提供微秒級(jí)的計(jì)時(shí); 能夠優(yōu)化web應(yīng)用程序和有大量用戶的在線事務(wù)處理中運(yùn)行時(shí)間很短的sql語句; 能通過比較源sql和待選sql的不同之處,為開發(fā)人員提供“邊做邊學(xué)式訓(xùn)練”,迅速提高開發(fā)人員的sql編程技能等等。
該工具針對(duì)數(shù)據(jù)庫應(yīng)用的開發(fā)和維護(hù)階段提供了數(shù)個(gè)特別的模塊:sql語法優(yōu)化器、pl/sql集成化開發(fā)調(diào)試環(huán)境(ide)、掃描器、數(shù)據(jù)庫監(jiān)視器等。其核心模塊之一“sql 語法優(yōu)化器”的工作原理大致如下:輸入一條源sql語句,“人工智能反饋式搜索引擎”對(duì)輸入的sql語句結(jié)合檢測到的數(shù)據(jù)庫結(jié)構(gòu)和索引進(jìn)行重寫,產(chǎn)生n條等效的sql語句輸出,產(chǎn)生的n條等效sql語句再送入“人工智能反饋式搜索引擎”進(jìn)行重寫,直至無法產(chǎn)生新的輸出或搜索限額滿,接下來對(duì)輸出的sql語句進(jìn)行過濾,選出具有不同執(zhí)行計(jì)劃的sql語句(不同的執(zhí)行計(jì)劃意味著不同的執(zhí)行效率),最后,對(duì)得到的sql語句進(jìn)行批量測試,找出性能最好的sql語句(參見下圖)。

lecco sql expert不僅能夠找到最佳的sql語句,它所提供的“邊做邊學(xué)式訓(xùn)練”還能夠教會(huì)開發(fā)人員和數(shù)據(jù)庫管理員如何寫出性能最好的sql語句。lecco sql expert的sql語句自動(dòng)優(yōu)化功能使sql的優(yōu)化變得極其簡單,只要能夠?qū)懗鰏ql語句,它就能幫開發(fā)人員找到最好性能的寫法。
小 結(jié)
sql語句是數(shù)據(jù)庫應(yīng)用中一個(gè)非常關(guān)鍵的部分,它執(zhí)行性能的高低直接影響著應(yīng)用程序的運(yùn)行效率。正因?yàn)槿绱耍藗冊(cè)趕ql語句的優(yōu)化上投入了很大的精力,出現(xiàn)了許多sql語句優(yōu)化工具。隨著人工智能等相關(guān)技術(shù)的日益成熟, 肯定還會(huì)有更多更好的工具出現(xiàn),這將會(huì)給開發(fā)人員提供更多的幫助。
新聞熱點(diǎn)
疑難解答
圖片精選