如果BOOKSHELF_CHECKOUT很大的话,速度可能会很慢,因为ORACLE会在BOOKSHELF_CHECKOUT上执行一个时间密集型的全表扫描。
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 ; 优化后的程序可以使用连接列上的索引。 WHERE B.TITLE IS NULL 表示不出现在BOOKSHELF_CHECKOUT中的TITLE列 (ORACLE作为NULL列返回,可参考外部连接方面的内容) 二: 使用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 可能无法使用这些索引。