資源描述:
《Informix查詢語句(SELECT)地優(yōu)化.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、查詢語句(SELECT)的優(yōu)化程序設(shè)計中的一個著名定律是20%的代碼用去了80%的時間,在數(shù)據(jù)庫應(yīng)用程序中也同樣如此。數(shù)據(jù)庫應(yīng)用程序的優(yōu)化通??煞譃閮蓚€方面:源代碼的優(yōu)化和SQL語句的優(yōu)化。源代碼的優(yōu)化在時間成本和風(fēng)險上代價很高;另一方面,源代碼的優(yōu)化對數(shù)據(jù)庫系統(tǒng)性能的提升收效有限。許多程序員認(rèn)為查詢優(yōu)化是DBMS(數(shù)據(jù)庫管理系統(tǒng))的任務(wù),與程序員所編寫的SQL語句關(guān)系不大,這是錯誤的。一個好的查詢計劃往往可以使程序性能提高數(shù)十倍。查詢計劃是用戶所提交的SQL語句的集合,查詢規(guī)劃是經(jīng)過優(yōu)化處理之后所產(chǎn)生的語句集合。DBMS處理查詢計劃的過程是這樣的:在做完查詢語句的詞法、語法檢查之后,將語句提
2、交給DBMS的查詢優(yōu)化器,優(yōu)化器做完代數(shù)優(yōu)化和存取路徑的優(yōu)化之后,由預(yù)編譯模塊對語句進(jìn)行處理并生成查詢規(guī)劃,然后在合適的時間提交給系統(tǒng)處理執(zhí)行,最后將執(zhí)行結(jié)果返回給用戶。雖然現(xiàn)在的數(shù)據(jù)庫產(chǎn)品在查詢優(yōu)化方面已經(jīng)做得越來越好,但由用戶提交的SQL語句是系統(tǒng)優(yōu)化的基礎(chǔ),很難設(shè)想一個原本糟糕的查詢計劃經(jīng)過系統(tǒng)的優(yōu)化之后會變得高效,因此用戶所寫語句的優(yōu)劣至關(guān)重要。1、對查詢語句進(jìn)行優(yōu)化的理由下列幾方面的原因是我們進(jìn)行SQL語句優(yōu)化的理由:◆SQL語句是對數(shù)據(jù)庫(數(shù)據(jù))進(jìn)行操作的惟一途徑;◆SQL語句消耗了70%~90%的數(shù)據(jù)庫資源;◆SQL語句獨立于程序設(shè)計邏輯,相對于對程序源代碼的優(yōu)化,對SQL語句的
3、優(yōu)化在時間成本和風(fēng)險上的代價都很低;◆SQL語句可以有不同的寫法;◆SQL語句易學(xué),難精通。從大多數(shù)數(shù)據(jù)庫應(yīng)用系統(tǒng)的實例來看,查詢操作在各種數(shù)據(jù)庫操作中所占據(jù)的比重最大,而查詢操作所基于的SELECT語句在SQL語句中又是代價最大的語句。2、查詢語句(SELECT)的優(yōu)化建議(1)、合理使用索引:where子句中變量順序應(yīng)與索引字鍵順序相同。如:create?index?test_idx?on?test(bdh,?rq,?xz)??? ?索引字鍵順序:首先是保單號bdh,其次是日期rq,最后是險種xz,所以where子句變量順序應(yīng)是where?bdh<=“P1234”and?rq=“06/0
4、6/1999”and?xz=“DAA”,不應(yīng)是where??xz=“DAA”?and?rq=“06/06/1999”?and?bdh?<=“P1234”這樣的不按索引字鍵順序?qū)懛ā#?)、將最具有限制性的條件放在前面,大值在前,小值在后?!? 如:where?colA<=10000??AND??colA>=1 效率高???? ?where?colA>=1??AND??colA<=10000??效率低(3)、避免采用MATCHES和LIKE通配符匹配查詢通配符匹配查詢特別耗費時間。即使在條件字段上建立了索引,在這種情況下也還是采用順序掃描的方式。例如語句:SELECT?*?FROM?custo
5、mer??WHERE?zipcode??MATCHES??“524*”可以考慮將它改為SELECT?*?FROM?customer?WHERE??ZipCode<=“524999”?AND?ZipCode?>=“524000”,則在執(zhí)行查詢時就會利用索引來查詢,顯然會大大提高速度。(4)、避免非開始的子串例如語句:SELECT?*?FROM?customer?WHERE?zipcode[2,3]?>“24”,在where子句中采用了非開始子串,因而這個語句也不會使用索引。(5)、避免相關(guān)子查詢一個字段的標(biāo)簽同時在主查詢和where子句中的查詢中出現(xiàn),那么很可能當(dāng)主查詢中的字段值改變之后,子查詢
6、必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應(yīng)當(dāng)盡量避免子查詢。如果子查詢不可避免,那么要在子查詢中過濾掉盡可能多的行。例如:將下面的語句select?bdh,bf?from?TabAwhere?item?IN?(select?item?form?TabB?where?TabB.num=50)改為:select?bdh,bf?from?TabA,?TabB????where?TabA.item=TabB.item?AND?TabB.num=50(6)、避免或簡化排序????應(yīng)當(dāng)簡化或避免對大型表進(jìn)行重復(fù)的排序。當(dāng)能夠利用索引自動以適當(dāng)?shù)拇涡虍a(chǎn)生輸出時,優(yōu)化器就避免了排序的步驟。以下是一些
7、影響因素:◆索引中不包括一個或幾個待排序的字段;◆group?by或order?by子句中字段的次序與索引的次序不一樣;◆排序的字段來自不同的表。????為了避免不必要的排序,就要正確地增建索引,合理地合并數(shù)據(jù)庫表(盡管有時可能影響表的規(guī)化,但相對于效率的提高是值得的)。如果排序不可避免,那么應(yīng)當(dāng)試圖簡化它,如縮小排序的字段的圍等。(7)、消除對大型表行數(shù)據(jù)的順序存取????在嵌套查詢中,對表的順