典型的查詢方式為:
SELECT TITLE
FROM BOOKSHELF
WHERE TITLE NOT IN
????? (SELECT TITLE FROM BOOKSHELF_CHECKOUT)
ORDER BY TITLE;
如果BOOKSHELF_CHECKOUT很大的話,速度可能會(huì)很慢,因?yàn)镺RACLE會(huì)在BOOKSHELF_CHECKOUT上執(zhí)行一個(gè)時(shí)間密集型的全表掃描。
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
對(duì)于BOOKSHELF中每一個(gè)記錄和BOOKSHELF_CHECKOUT匹配則是EXISTS.NOT EXISTS則是不存在的。
NOT EXISTS往往可以使用可利用的索引,NOT IN 可能無法使用這些索引。