您的位置:程序门 -> db2 -> 数据库开发



not in和not exists的区别


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


not in和not exists的区别
发表于:2007-05-03 20:27:41 楼主
有一个sql语句,原来用的not   in操作,但是执行时间太长,花费了约7分钟
因为整个业务中使用了两次类似的操作,两次操作就约花费时间14分钟,加上其他操作共17分钟左右
需要做一些改进,我换成not   exists   后速度明显变快了,约3分钟左右
但最后对结果进行确认,数据略有差别,原来用not   in查询能出来的结果,用not   exists查询就没有出来
也就是说not   exists比not   in少了一些数据,   请问

not   in   和   not   exists   具体的区别在哪里?   什么原因导致not   in能出的数据在not   exists就不出?
select   xxxxx
                                from   \
                                                (select   *   from   $1   \
                                                                where   \
                                                                                kessan_kbn=3   and   (br_cd,kokyaku_no)   in   \
                                                                                                (select   a.br_cd,a.kokyaku_no   from   $1   a,$1   b   \
                                                                                                where   a.kessan_kbn   =2   and     b.kessan_kbn   =3   and   a.br_cd   =   b.br_cd   and   a.kokyaku_no   =   b.kokyaku_no   ))   a,   \
                                                                                                (select   *   from   $1   \
                                                                                                where   kessan_kbn=2   and   (br_cd,kokyaku_no)   in   \
                                                                                                (select   a.br_cd,a.kokyaku_no   from   $1   a,$1   b   \
                                                                                                where   a.kessan_kbn   =2   and     b.kessan_kbn   =3   and   a.br_cd   =   b.br_cd   and   a.kokyaku_no   =   b.kokyaku_no   ))   b   \
                                                where   a.br_cd   =   b.br_cd   and   a.kokyaku_no   =   b.kokyaku_no   \
                                union   all   \
select   xxxxx
from   \
                                                (select   *   from   $1   \
                                                where   kessan_kbn=3   and   (br_cd,kokyaku_no)   not   in   \
                                                (select   a.br_cd,a.kokyaku_no   from   $1   a,$1   b   \
                                                where   a.kessan_kbn   =2   and   b.kessan_kbn   =3   and   a.br_cd   =   b.br_cd   and   a.kokyaku_no   =   b.kokyaku_no   ))   a

说明:1.用了union   all,但我看了,费时间最多的不是union,而是下面的   not   in
              2.同样,上面的   in   花费时间也不算多
              3.xxxxx是查询的字段名,很多
              4.$1是传入的参数,表名

请问有什么好的办法改进吗?
发表于:2007-05-26 09:43:081楼 得分:0
用左连接是空的方法试试
发表于:2007-07-03 09:08:352楼 得分:0
该回复于2007-12-29 16:24:29被管理员或版主删除
发表于:2007-10-28 16:39:533楼 得分:0
not   in   要扫描全表的
我觉得您要优化,应该先从业务入手。您的业务不知是要干什么,但总觉的可以变化一下,不用这么复杂。
发表于:2007-10-29 15:17:424楼 得分:0
not       exists   是判断返回的是否是ture,和not   in不是一样的,在一些情况下是可以相互转化的。

not       exists的性能比not   in高,因为不需要进行子查询了。


快速检索

最新资讯
热门点击