in 与exists、 not in与 not exists的一点感想

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
有些书与人说EXISTS 代替IN ,NOT EXISTS 代替NOT IN 查询会加快可是经过我的实验用EXISTS 代替IN j是可以加快查询,可是NOT EXISTS 代替NOT IN 查询总是比NOT IN代替NOT EXISTS查询慢呀!
不知是何原因不是那位同仁有这方面的体会呀。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
你的例子????
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
select * from z518temp where mobileno not in(select mobileno from z518 where mobileno like '13974%')时间为7.521秒
select * from z518temp where not exists (select 'x' from z518 where z518.mobileno=z518temp.mobileno and z518.mobileno like '13974%')
时间为17.184秒
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 pjp2004 发布
[B]select * from z518temp where mobileno not in(select mobileno from z518 where mobileno like '13974%')时间为7.521秒
select * from z518temp where not exists (select 'x' from z518 where z518.mobileno=z518temp.mobileno and z518.mobileno like '13974%')
时间为17.184秒 [/B]

不能一概而论的,即使exist 和 in 也不能说哪个更快,要看具体情况,尤其是外层表和内层表的返回结果的数量。做个实验先。。。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
我做过实验呀
据你所说那么样才能使查询最快呀
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
关键在于 对数据的了解 和对执行计划的了解
单从表面上看 sql 的形,很多时候都会误判断的
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
老总你说得太好了太深渊了点吧
不会是折中主义者吧
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
sqltrace willtellyou thetruth!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
SELECT EXECUTIONS,DISK_READS,BUFFER_GETS,ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,SQL_TEXT FROM V$SQLAREA WHERE EXECUTIONS>0 AND BUFFER_GETS>0 AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS<0.8 ORDER BY 4 DESC;
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
1: 先搜索 execution plan ,读相关文章,明白怎么查看执行计划和什么是执行计划
2:搜索 sqltrace ,读相关文章,明白怎么跟踪执行计划和sql运行统计信息
3:理解 sql tuning和 oracle 优化器
当经过这几步之后,相信你再也不会问这样的问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行