總體來說,SQL語句最佳化策略有以下幾個方面:
● 建立表的時候。應盡量建立主鍵,根據主鍵查詢資料;● 大資料表刪除,用truncate table代替delete。● 合理使用索引,在OLTP應用中一張表的索引不要太多。複合式索引的列順序盡量與查詢條件列順序保持一致;對於資料操作頻繁的表,索引需要定期重建,以減少失效的索引和片段。● 查詢盡量用確定的列名,少用*號。盡量少嵌套子查詢,這種查詢會消耗大量的CPU資源;對於有比較多or運算的查詢,建議分成多個查詢,用union all連接起來;多表查詢的查詢語句中,選擇最有效率的表名順序(基於規則的最佳化器中有效)。Oracle解析器對錶解析從右至左,所以記錄少的表放在右邊。● 盡量多用commit語句提交事務,可以及時釋放資源、解鎖、釋放日誌空間、減少管理花費;在頻繁的、效能要求比較高的資料操作中,盡量避免遠端存取,如資料庫鏈等,訪問頻繁的表可以常駐記憶體:alter table...cache;
詳細分來:
1、盡量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
2、不用NOT IN操作符,可以用NOT EXISTS或者外串連+(外串連+判斷為空白)替代。 3、不用“<>”或者“!=”操作符。對不等於操作符的處理會造成全表掃描,可以用“<” or “>”代替。例如:a<>0 改為 a>0 or a<0,a<>’ ’ 改為 a>’ ’
4、Where子句中出現IS NULL或者IS NOT NULL時,Oracle會停止使用索引而執行全表掃描。可以考慮在設計表時,對索引列設定為NOT NULL。這樣就可以用其他動作來取代判斷NULL的操作。
5、當萬用字元“%”或者“_”作為查詢字串的第一個字元時,索引不會被使用,因此一般不要作為第一個字元出現。
6、對於有串連的列“||”,最後一個串連列索引會無效。盡量避免串連,可以分開串連或者使用不作用在列上的函數替代。
7、如果索引不是基於函數的,那麼當在Where子句中對索引列使用函數時,索引不再起作用。
8、Where子句中避免在索引列上使用計算,否則將導致索引失效而進行全表掃描。
9、對資料類型不同的列進行比較時,會使索引失效。
10、用“>=”替代“>”。
11、UNION操作符會對結果進行篩選,消除重複,資料量大的情況下可能會引起磁碟排序。如果不需要重複資料刪除記錄,應該使用UNION ALL。
12、Oracle從下到上處理Where子句中多個查詢條件,所以表串連語句應寫在其他Where條件前,可以過濾掉最大數量記錄的條件必須寫在Where子句的末尾。
13、Oracle從右至左處理From子句中的表名,所以在From子句中包含多個表的情況下,將記錄最少的表放在最後。
14、Order By語句中的非索引列會降低效能,可以通過添加索引的方式處理。嚴格控制在Order By語句中使用運算式。
15、不同地區出現的相同的Sql語句,要保證查詢字元完全相同,以利用SGA共用池,防止相同的Sql語句被多次分析。
16、多利用內建函式提高Sql效率。
17、當在Sql語句中串連多個表時,使用表的別名,並將之作為每列的首碼。這樣可以減少解析時間。
18、根據SQL不同設定最佳化模式的方式,選擇不同的最佳化策略,通過SELECT /*+ALL+_ROWS*/ ……;來設定。可用的HINT包括/*+ALL_ROWS*/、/*+FIRST_ROWS*/、/*+CHOOSE*/、/*+RULE*/ 等一般在SQL前加first_rows策略,速度都會提高,特殊情況下改用choose策略。(本策略架構包已經支援)
19、對於大表查詢中的列應盡量避免進行諸如To_char,to_date,to_number等轉換
20、有索引的盡量用索引,有用到索引的條件寫在前面
21、如有可能和有必要就建立一些索引
22、盡量避免進行全表掃描,限制條件儘可能多,以便更快搜尋到要查詢的資料