【SQL最佳化】SQL最佳化的10點注意事項

muxinqing發表於2014-05-08
1.目前普遍採用的10g資料庫已經採用CBO的最佳化方式,所以記得定期的對資料庫核心業務使用者進行全面或有選擇的分析,防止出現執行計劃出現異常。
Oracle 10g以及以後的11g自動化一切的背後隱藏著很多神秘而有趣的東西。

2.充分共享SQL語句,方法是在書寫程式的時候儘量使用繫結變數
是否能共享SQL語句需要滿足如下三個條件:
1)能共享的SQL語句需要每個字元都要完全一樣,即使是空格的數量也要一樣;
2)需要語句所引用的的物件必須完全相同,如果引用的是不同使用者的內容也無法共享
3)繫結變數的名字要求必須一樣

3.程式中全面禁止使用select *樣式的SQL語句
原因之一:Oracle會將“*”依次轉換成所有的列名,需要查詢資料字典,耗費資源;
原因之二:考慮到表結構的變化,不利於程式的維護。

4.減少資料庫訪問的次數,這點符合“少讀和少寫原則”
原因:訪問資料庫解析是有代價的
例如:能用一條關聯語句查詢出來結果時,就不要分多條語句進行檢索。

5.對於需要快速大批次的刪除資料時,要使用TRUNCATE替代DELETE操作。

6.在使用like語句時,避免使用like '%abc'形式,否則無法使用到索引(對索引特殊處理除外)
原因:WHERE子句中, 如果索引列所對應的值的第一個字元由萬用字元(WILDCARD)開始, 索引將不被採用。

7.不要在索引列上進行函式類的計算
原因:WHERE子句中,如果對索引列進行函式計算,最佳化器將不能有效的使用索引而選擇全表掃描。
迂迴的處理方法:如果確實要頻繁的使用到函式操作,可以考慮在相應列上使用函式索引。

8.不要在索引列上使用IS NULL和IS NOT NULL做限制條件
原因:Oracle中的null在索引中是不記錄的。

9.在索引列上可以考慮使用UNION代替OR運算子
原因:
使用UNION代替OR的方法從執行計劃上來看,避免了FILTER操作,降低了一致性讀(consistent gets),從而提高了SQL的執行效率。
如果操作的是索引列,更加推薦使用這樣的替換方式,可以有效的提高SQL的執行效率,這也是OR運算子的一種很好的最佳化方法。
如果不是索引列,需要具體情況具體分析。
OR運算子的最佳化,有時也可以考慮透過IN的方式來限制,也可以不同程度的提高一些SQL的執行效能

10.第十點就是最佳化最最基本的原則——最佳化後達到“少讀少寫”的目的
透過執行計劃等有效的工具來反覆比較最佳化前和最佳化後對資料庫的讀寫情況,往往最佳化後的共同特徵就是讓SQL能夠儘量的少讀資料庫和少寫資料庫。

先列這10條,歡迎大家補充。

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29065182/viewspace-1156637/,如需轉載,請註明出處,否則將追究法律責任。

相關文章