新聞中心
在Oracle SQL的優(yōu)化的規(guī)則中我們***少用IN操作符,因?yàn)橐话愕腎N操作符都是可以用EXISTS來代替,我們都知道用IN寫出的SQL的話,它的優(yōu)點(diǎn)就是比較容易寫及清晰易懂,但是用IN的SQL性能總是比較低的,從ORACLE執(zhí)行的步驟來分析用IN的SQL與不用IN的SQL有以下區(qū)別:

目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計(jì)、北碚網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
ORACLE 試圖將其轉(zhuǎn)換成多個(gè)表的連接,如果轉(zhuǎn)換不成功則先執(zhí)行IN里面的子查詢,再查詢外層的表記錄,如果轉(zhuǎn)換成功則直接采用多個(gè)表的連接方式查詢。由此可見用 IN的SQL至少多了一個(gè)轉(zhuǎn)換的過程。一般的Oracle SQL都可以轉(zhuǎn)換成功,但對于含有分組統(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ù)量大小來具體考慮。
推薦方案:在業(yè)務(wù)密集的Oracle SQL當(dāng)中盡量不采用IN操作符。
不用NOT IN操作符,可以用NOT EXISTS或者外連接+替代 此操作是強(qiáng)列推薦不使用的,因?yàn)樗荒軕?yīng)用表的索引。
推薦方案:用NOT EXISTS 或(外連接+判斷為空)方案代替
不用“<>”或者“!=”操作符。對不等于操作符的處理會造成全表掃描,可以用“<” or “>”代替
不等于操作符是永遠(yuǎn)不會用到索引的,因此對它的處理只會產(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會停止使用索引而執(zhí)行全表掃描??梢钥紤]在設(shè)計(jì)表時(shí),對索引列設(shè)置為NOT NULL。這樣就可以用其他操作來取代判斷NULL的操作
IS NULL 或IS NOT NULL操作(判斷字段是否為空) 判斷字段是否為空一般是不會應(yīng)用索引的,因?yàn)锽樹索引是不索引空值的。
【編輯推薦】
- 對Oracle數(shù)據(jù)庫設(shè)計(jì)中字段的正確使用方案
- 訪問 Oracle 數(shù)據(jù)庫的實(shí)例描述
- Oracle數(shù)據(jù)庫的密集型實(shí)際應(yīng)用程序的開發(fā)
- 提高 Oracle JDBC的性能的辦法
- 淺談Oracle函數(shù)返回Table集合
網(wǎng)頁名稱:OracleSQL的優(yōu)化的規(guī)則描述
標(biāo)題URL:http://www.5511xx.com/article/dhhgsgi.html


咨詢
建站咨詢
