SQL語句效率問題的幾點總結(jié)

1. sql優(yōu)化的原則是:

? 將一次操作需要讀取的BLOCK數(shù)減到最低,即在最短的時間達到最大的數(shù)據(jù)吞吐量。???
? 調(diào)整不良SQL通常可以從以下幾點切入:???
? 檢查不良的SQL,考慮其寫法是否還有可優(yōu)化內(nèi)容???
? 檢查子查詢?? 考慮SQL子查詢是否可以用簡單連接的方式進行重新書寫???
? 檢查優(yōu)化索引的使用???
? 考慮數(shù)據(jù)庫的優(yōu)化器

2. 避免出現(xiàn)SELECT?? *?? FROM?? table???? 語句,要明確查出的字段。?????
????
3. 在一個SQL語句中,如果一個where條件過濾的數(shù)據(jù)庫記錄越多,

??? 定位越準確,則該where條件越應(yīng)該前移。???
????
4. 查詢時盡可能使用索引覆蓋。即對SELECT的字段建立復合索引,

??? 這樣查詢時只進行索引掃描,不讀取數(shù)據(jù)塊。

5. 在判斷有無符合條件的記錄時建議不要用SELECT?? COUNT?? (*)和select?? top?? 1?? 語句。???
????
6. 使用內(nèi)層限定原則,在拼寫SQL語句時,將查詢條件分解、分類,

??? 并盡量在SQL語句的最里層進行限定,以減少數(shù)據(jù)的處理量。???
????
7. 應(yīng)絕對避免在order?? by子句中使用表達式。???
????
8. 如果需要從關(guān)聯(lián)表讀數(shù)據(jù),關(guān)聯(lián)的表一般不要超過7個。???
????
9. 小心使用?? IN?? 和?? OR,需要注意In集合中的數(shù)據(jù)量。建議集合中的數(shù)據(jù)不超過200個。???
????
10. ?? 用?? ?? 代替,>用>=代替,????
11. 在查詢時盡量減少對多余數(shù)據(jù)的讀取包括多余的列與多余的行。???
????
12. 對于復合索引要注意,例如在建立復合索引時列的順序是F1,F(xiàn)2,F(xiàn)3,

???? 則在where或order?? by子句中這些字段出現(xiàn)的順序要與建立索引時的字段順序一致,

??? 且必須包含第? 一列。只能是F1或F1,F(xiàn)2或F1,F(xiàn)2,F(xiàn)3。否則不會用到該索引。?

13. 多表關(guān)聯(lián)查詢時,寫法必須遵循以下原則,這樣做有利于建立索引,提高查詢效率。

???? 格式如下

???? select?? sum(table1.je)?? from?? table1?? table1,???? table2???? table2,???????????????

???? table3???? table3?? where?? (table1的等值條件(=))?? and?? (table1的非等值條件)?

???? and?? (table2與table1的關(guān)聯(lián)條件)?? and (table2的等值條件)?? and?? (table2的非等值條件)????

???? and (table3與table2的關(guān)聯(lián)條件)?? and?? (table3的等值條件)?? and?? (table3的非等值件)。???
???? 注:關(guān)于多表查詢時from???? 后面表的出現(xiàn)順序?qū)π实挠绊戇€有待研究。???
????
14. 子查詢問題。對于能用連接方式或者視圖方式實現(xiàn)的功能,不要用子查詢。

???? 例如:select?? name??? from?? customer?? where??

???? customer_id?? in?? (?? select???? customer_id?? from?? order?? where?? money>1000)。

???? 應(yīng)該用如下語句代替:select?? name?? from?? customer??

??? inner?? join?? order?? on???? customer.customer_id=order.customer_id??

??? where?? order.money>100。???
????
15. 在WHERE?? 子句中,避免對列的四則運算,

???? 特別是where?? 條件的左邊,嚴禁使用運算與函數(shù)對列進行處理。

???? 比如有些地方?? substring?? 可以用like代替。???
????
16. 如果在語句中有not?? in(in)操作,

???? 應(yīng)考慮用not?? exists(exists)來重寫,最好的辦法是使用外連接實現(xiàn)。???
??????
17. 對一個業(yè)務(wù)過程的處理,應(yīng)該使事物的開始與結(jié)束之間的時間間隔越短越好,

???? 原則上做到數(shù)據(jù)庫的讀操作在前面完成,數(shù)據(jù)庫寫操作在后面完成,避免交叉。

18. 請小心不要對過多的列使用列函數(shù)和order?? by,group?? by等,謹慎使用disti軟件開發(fā)t。???
????
19. 用union?? all?? 代替?? union,數(shù)據(jù)庫執(zhí)行union操作,

???? 首先先分別執(zhí)行union兩端的查詢,

???? 將其放在臨時表中,然后在對其進行排序,過濾重復的記錄。???
???? 當已知的業(yè)務(wù)邏輯決定query?? A和query?? B中不會有重復記錄時,

???? 應(yīng)該用union?? all代替union,以提高查詢效率。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊7 分享