ORACLE中用EXISTS代替DISTINCT的疑问?

Raymond C WTsing 2012-04-09 10:17:14
最近看到ORACLE优化的一点建议,其中一点是用EXISTS代替DISTINCT,并给出例子:
------------DISTINCT------------------
select distinct d.deptno,d.dname
from dept d,emp e
where d.deptno = e.deptno;

------------EXISTS------------------
SELECT D.DEPTNO,D.DNAME
FROM DEPT D
WHERE EXISTS (SELECT 'X'
FROM EMP E
WHERE E.DEPTNO = D.DEPTNO);

问题:1.问什么EXISTS能实现DISTINCT功能,其运行原理是怎样的?
...全文
1031 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
PaulPaul 2014-02-14
  • 打赏
  • 举报
回复 2
用EXISTS,只要找到第一个符合条件的值,就返回了,而不管后面有多少条符合条件的重复记录。 而DISTINCT,是全扫描,必须查找全部符合条件的记录后,再返回唯一值。 这样一来,性能差异就大了。
Raymond C WTsing 2012-04-18
  • 打赏
  • 举报
回复
谢谢各位的耐心解答,学习了!
  • 打赏
  • 举报
回复
那要看数据量了 一般情况 区别没那么大 数量大了 差别就看不出了 举例这个 只是更加明显
Raymond C WTsing 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果


其中X的意思:
因为exists只是看子查询是否有结果返回,而并不关心返回的是什么内容,因此通常建议写一个常量,至少性能不可能比select 一个具体的字段……
[/Quote]

也就是说,若不是提交一个包含一对多表信息的查询EXISTS就不能起到替代DISTINCT的作用?
  • 打赏
  • 举报
回复
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果


其中X的意思:
因为exists只是看子查询是否有结果返回,而并不关心返回的是什么内容,因此通常建议写一个常量,至少性能不可能比select 一个具体的字段出来差,而某些情况下,select具体的字段出来性能可能比select 一个常量出来要差得多。
hupeng213 2012-04-10
  • 打赏
  • 举报
回复
EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果
-->经测试此写法SQLplus下比上面的写法多一次逻辑读,而在Toad下两者结果一致

这个也是从别人那里看到的, 出处不记得了
ssqtjffcu 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
最近看到ORACLE优化的一点建议,其中一点是用EXISTS代替DISTINCT,并给出例子:
------------DISTINCT------------------
select distinct d.deptno,d.dname
from dept d,emp e
where d.deptno = e.deptno;

------------EXISTS----------……
[/Quote]
因为两个出来的结果是一样,而exists的效率要高,它是找到符合条件就直接返回。所以可以代替
ssqtjffcu 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
最近看到ORACLE优化的一点建议,其中一点是用EXISTS代替DISTINCT,并给出例子:
------------DISTINCT------------------
select distinct d.deptno,d.dname
from dept d,emp e
where d.deptno = e.deptno;

------------EXISTS----------……
[/Quote]
因为两个出来的结果是一样,而exists的效率要高,它是找到符合条件就直接返回。所以可以代替

17,378

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧