发布网友 发布时间: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