ORACLE中NOT IN 的替代
典型的查詢方式為:
SELECT TITLE
FROM BOOKSHELF
WHERE TITLE NOT IN
????? (SELECT TITLE FROM BOOKSHELF_CHECKOUT)
ORDER BY TITLE;
如果BOOKSHELF_CHECKOUT很大的話,速度可能會很慢,因為ORACLE會在BOOKSHELF_CHECKOUT上執(zhí)行一個時間密集型的全表掃描。
oracle 中not in 效率不高
一:
使用外部連接
SELECT DISTINCT C.TITLE
FROM BOOKSHELF_CHECKOUT B RIGHT OUTER JOIN BOOKSHELF C
??? ON B.TITLE = C.TITLE
WHERE B.TITLE IS NULL
ORDER BY C.TITLE ;
優(yōu)化后的程序可以使用連接列上的索引。
WHERE B.TITLE IS NULL
表示不出現(xiàn)在BOOKSHELF_CHECKOUT中的TITLE列 (ORACLE作為NULL列返回,可參考外部連接方面的內(nèi)容)
二:
使用NOT EXISTS
SELECT B.TITLE
FROM BOOKSHELF B
WHERE NOT EXISTS
???? (SELECT 'X' FROM BOOKSHELF_CHECKOUT C
????? WHERE C.TITLE = B.TITLE)
ORDER BY B.TITLE
對于BOOKSHELF中每一個記錄和BOOKSHELF_CHECKOUT匹配則是EXISTS.NOT EXISTS則是不存在的。
NOT EXISTS往往可以使用可利用的索引,NOT IN 可能無法使用這些索引。
posted on 2009-06-10 14:18 freebird 閱讀(1460) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫