ORACLE EXISTS执行顺序问题

发布网友 发布时间:2022-04-20 15:48

我来回答

3个回答

热心网友 时间:2022-05-02 07:49

首先,

这两个查询语句,查询到的结果是不一样的。

第一个语句:

SELECT COUNT(1) FROM DUAL WHERE EXISTS (SELECT 1 FROM XXX WHERE YY IS NOT NULL);

结果只能是1或者0。

第二个语句:

SELECT COUNT(1) FROM XXX WHERE YY IS NOT NULL;

结果就是xxx表中yy字段不为空的个数。


其次,

如果你只是判断xxx表中yy字段是否有不为空的记录,那么第一个语句效率应该说高一些。

我的理解是这样的,表的block(没有索引的话)肯定是要拿到buffer cache里面(非direct path read),只是当判断的时候会减少一些操作,当执行判断到第一条yy is not null的时候,就不会继续下面的判断操作了。

就算是这样,我觉得效率应该也不会提升多少,顶多也就是节省了cpu的使用。

如果想具体的了解他们两个语句的执行方式,可以开启session的10046事件跟踪一下,比较两个sql语句执行的异同。

热心网友 时间:2022-05-02 09:07

结果都不同,当然第1个快了啊
第一个是判断是否存在,存在就返回,不再继续判断(是否为空)
第2个是计算条数,需要全表检索完,才能得到结果
2个sql应该都是全表扫描

热心网友 时间:2022-05-02 10:42

EXISTS 检索到存在的就跳出的
所有搜索的资源主要是在 DUAL这个表
搜索的顺序是 al的内容 然后 判断exists

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com