计算机学习积累

----转载有理,转载是想研究,想研究才会看,看了才会有感想,转载后我有时会写一些自己的感受
数据加载中……

ORACLE中NOT IN 的替代

典型的查询方式为:
SELECT TITLE
FROM BOOKSHELF
WHERE TITLE NOT IN
      (SELECT TITLE FROM BOOKSHELF_CHECKOUT)
ORDER BY TITLE;

如果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 可能无法使用这些索引。

posted on 2009-06-10 14:18 freebird 阅读(1444) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航: