SQL語句編寫與優化規範

學識都 人氣:5.54K

1 用SELECT查詢用具體欄位代替“*”,且儘可能只查詢需要的欄位。

SQL語句編寫與優化規範

2 多表查詢時,使用表的別名,就可以減少解析的時間並減少那些由列名歧義引起的語法錯誤

3 用EXISTS替代IN,用NOT EXISTS替代NOT IN

4 WHERE條件連線順序,把表關係寫在最前

例如Oracle採用自下而上的順序解析WHERE子句,表之間的條件連線必須寫在其他條件之前,把可以過濾掉大量資料的條件寫在WHERE子句的最後,按照過濾記錄數量的多少

5 刪除全表時,用TRUNCATE替代DELETE

當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的資訊. 如果你沒有COMMIT事務,ORACLE會將資料恢復到刪除之前的狀態(準確地說是恢復到執行刪除命令之前的狀況) 而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的資訊.

當命令執行後,資料不能被恢復.因此很少的資源被呼叫,執行時間也會很短。但只有在刪除全.表資料時才這樣使用。 ...

6 儘可能多的使用commit

對於執行,update,語句時儘量多commit,因為系統性能會因commit釋放的資源而大大提高。注意事務的處理,因為commit的資料是不允許回滾的。

7 優化GROUP BY

為提高GROUP BY的效率,可以將不需要的資料在GROUP BY之前過濾掉,減少由於資料量大而帶來的效能損耗。同時避免使用HAVING子句,HAVING只會在檢索出所有記錄之後才對結果集進行過濾,這個處理需要排序、統計等操作。如果能通過WHERE子句限制記

8 ORDER BY欄位需建立索引

ORDER BY語句以找出非索引項或者表示式,它們會降低效能。解決這個問題的辦法就是重寫ORDER BY語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在order by子句中使用表示式。

9 有條件的使用union-all 替代union

這樣做效率會提高3到5倍。

10 IS NULL 與 IS NOT NULL(索引失效)

不能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高效能。

任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。

11 對於有聯接的列,即使最後的聯接值為一個靜態值,優化器是不會使用索引的`。(索引失效)

12 避免使用帶萬用字元的LIKE查詢(索引失效)

之前我認為只要含有“%”的LIKE查詢索引就會失效,經過網路資料查詢,說只有“%”13 注意or條件查詢,兩邊條件必須均建立索引才會生效(索引失效)

14 避免在索引列上使用函式或計算,如果索引是函式的一部分,則優化器不會使用索引。(索引失效)

15 避免使用not、!=、<>(索引失效)

索引只能告訴什麼存在於表中,不能告訴我們什麼不存在,當資料庫遇到not、!=、<>時,索引會失效而去進行全表掃描。用“>=”代替“>”

總結

原則上,應該儘可能的減少與資料庫的互動,但不意味著要寫一個龐大複雜的SQL來獲取所有需要的資料。對於複雜或訪問量頻繁的功能,可以考慮藉助快取來提升效能。對於表資料量過於龐大而且持續增長,考慮歸檔歷史,分開查詢;如果仍然無法提升效能,則可以從增加硬體來改善,如讀寫分離、資料庫叢集等方案。

在拼寫SQL時,儘可能的將SQL拆解為簡單易讀的SQL,對於複雜邏輯可以藉助程式來協同完成,一方面執行效率不一定低,另一方面也給未來的運維、修改帶來便捷。如果設計原因導致關聯表略多,考慮檢視、拆解、輔助表的方式來簡化查詢,降低SQL複雜度,減少表關聯查詢的數量(少於5表),且儘可能少用子查詢,檢視巢狀不要超過2層。