在Oracle SQL的優化的規則中我們最好少用IN操作符,因為一般的IN操作符都是可以用EXISTS來代替,我們都知道用IN寫出的SQL的話,它的優點就是比較容易寫及清晰易懂,但是用IN的SQL性能總是比較低的,從Oracle執行的步驟來分析用IN的SQL與不用IN的SQL有以下區別:
ORACLE 試圖將其轉換成多個表的連接,如果轉換不成功則先執行IN裡面的子查詢,再查詢外層的表記錄,如果轉換成功則直接采用多個表的連接方式查詢。由此可見用 IN的SQL至少多了一個轉換的過程。一般的Oracle SQL都可以轉換成功,但對於含有分組統計等方面的SQL就不能轉換了。
Oracle在執行IN子查詢時,首先執行子查詢,將查詢結果放入臨時表再執行主查詢。而EXIST則是首先檢查主查詢,然後運行子查詢直到找到第一個匹配項。NOT EXISTS比NOT IN效率稍高。但具體在選擇IN或EXIST操作時,要根據主子表數據量大小來具體考慮。
推薦方案:在業務密集的Oracle SQL當中盡量不采用IN操作符。
不用NOT IN操作符,可以用NOT EXISTS或者外連接+替代 此操作是強列推薦不使用的,因為它不能應用表的索引。
推薦方案:用NOT EXISTS 或(外連接+判斷為空)方案代替
不用“<>”或者“!=”操作符。對不等於操作符的處理會造成全表掃描,可以用“<” or “>”代替
不等於操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃描。
推薦方案:用其它相同功能的操作運算代替,如:
1)a<>0 改為 a>0 or a<0
2)a<>’’ 改為 a>’’
Where子句中出現IS NULL或者IS NOT NULL時,Oracle會停止使用索引而執行全表掃描。可以考慮在設計表時,對索引列設置為NOT NULL。這樣就可以用其他操作來取代判斷NULL的操作
IS NULL 或IS NOT NULL操作(判斷字段是否為空) 判斷字段是否為空一般是不會應用索引的,因為B樹索引是不索引空值的。