有两句sql,第一句是:SELECt COUNT(1) FROM DUAL WHERe EXISTS (SELECt 1 FROM XXX WHERe YY IS NOT NULL);
第二句是:SELECt COUNT(1) FROM XXX WHERe YY IS NOT NULL;
从执行效率上来说是第一种的快,对于第二种,我理解的是这个必须扫描所有行,才会返回结果。
但是对于第一种括号内的那一段,不也是需要扫描所有行才会返回一个结果,然后再通过括号外的条件去判断,还是说先括号内扫描一行,再外面判断一下,然后再里面扫描一行,外面判断一下?
ORACLE EXISTS执行顺序问题
答案:3 悬赏:10 手机版
解决时间 2021-03-13 03:36
- 提问者网友:蓝琪梦莎
- 2021-03-12 07:29
最佳答案
- 五星知识达人网友:慢性怪人
- 2021-03-12 08:11
首先,
这两个查询语句,查询到的结果是不一样的。
第一个语句:
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语句执行的异同。
这两个查询语句,查询到的结果是不一样的。
第一个语句:
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语句执行的异同。
全部回答
- 1楼网友:人類模型
- 2021-03-12 10:05
EXISTS 检索到存在的就跳出的
所有搜索的资源主要是在 DUAL这个表
搜索的顺序是 dual的内容 然后 判断exists
- 2楼网友:人類模型
- 2021-03-12 08:40
select id
from entity
where etype in ('d')
and parent_id = 83
and id not in (select id from lbs_person)
嘿嘿,既然not in效率低,那么上边你也别用etype in ('d') 了,一个道理,不如etype='d'了
select id
from entity
where etype in ('d')
and parent_id = 83
and not exists (select id from lbs_person) 语法没错误,你找找是不是字符类型的错,把错误的id号写出来
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯