Oracle SQL的優(yōu)化的規(guī)則描述
在Oracle SQL的優(yōu)化的規(guī)則中我們***少用IN操作符,因?yàn)橐话愕腎N操作符都是可以用EXISTS來(lái)代替,我們都知道用IN寫出的SQL的話,它的優(yōu)點(diǎn)就是比較容易寫及清晰易懂,但是用IN的SQL性能總是比較低的,從ORACLE執(zhí)行的步驟來(lái)分析用IN的SQL與不用IN的SQL有以下區(qū)別:
ORACLE 試圖將其轉(zhuǎn)換成多個(gè)表的連接,如果轉(zhuǎn)換不成功則先執(zhí)行IN里面的子查詢,再查詢外層的表記錄,如果轉(zhuǎn)換成功則直接采用多個(gè)表的連接方式查詢。由此可見用 IN的SQL至少多了一個(gè)轉(zhuǎn)換的過(guò)程。一般的Oracle SQL都可以轉(zhuǎn)換成功,但對(duì)于含有分組統(tǒng)計(jì)等方面的SQL就不能轉(zhuǎn)換了。
Oracle在執(zhí)行IN子查詢時(shí),首先執(zhí)行子查詢,將查詢結(jié)果放入臨時(shí)表再執(zhí)行主查詢。而EXIST則是首先檢查主查詢,然后運(yùn)行子查詢直到找到***個(gè)匹配項(xiàng)。NOT EXISTS比NOT IN效率稍高。但具體在選擇IN或EXIST操作時(shí),要根據(jù)主子表數(shù)據(jù)量大小來(lái)具體考慮。
推薦方案:在業(yè)務(wù)密集的Oracle SQL當(dāng)中盡量不采用IN操作符。
不用NOT IN操作符,可以用NOT EXISTS或者外連接+替代 此操作是強(qiáng)列推薦不使用的,因?yàn)樗荒軕?yīng)用表的索引。
推薦方案:用NOT EXISTS 或(外連接+判斷為空)方案代替
不用“<>”或者“!=”操作符。對(duì)不等于操作符的處理會(huì)造成全表掃描,可以用“<” or “>”代替
不等于操作符是永遠(yuǎn)不會(huì)用到索引的,因此對(duì)它的處理只會(huì)產(chǎn)生全表掃描。
推薦方案:用其它相同功能的操作運(yùn)算代替,如:
1)a<>0 改為 a>0 or a<0
2)a<>’’ 改為 a>’’
Where子句中出現(xiàn)IS NULL或者IS NOT NULL時(shí),Oracle會(huì)停止使用索引而執(zhí)行全表掃描。可以考慮在設(shè)計(jì)表時(shí),對(duì)索引列設(shè)置為NOT NULL。這樣就可以用其他操作來(lái)取代判斷NULL的操作
IS NULL 或IS NOT NULL操作(判斷字段是否為空) 判斷字段是否為空一般是不會(huì)應(yīng)用索引的,因?yàn)锽樹索引是不索引空值的。
【編輯推薦】