zoukankan      html  css  js  c++  java
  • not in和not exists的区别

    exists   和   in   的执行效率是一样的

      很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not   exists来代替not   in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL   SERVER自带的pubs数据库。运行前我们可以把SQL   SERVER的statistics   I/O状态打开。

      (1)select   title,price   from   titles   where   title_id   in   (select   title_id   from   sales   where   qty >30)

      该句的执行结果为:

      表   'sales '。扫描计数   18,逻辑读   56   次,物理读   0   次,预读   0   次。

      表   'titles '。扫描计数   1,逻辑读   2   次,物理读   0   次,预读   0   次。

      (2)select   title,price   from   titles   where   exists   (select   *   from   sales   where   sales.title_id=titles.title_id   and   qty >30)

      第二句的执行结果为:

      表   'sales '。扫描计数   18,逻辑读   56   次,物理读   0   次,预读   0   次。

      表   'titles '。扫描计数   1,逻辑读   2   次,物理读   0   次,预读   0   次。

      我们从此可以看到用exists和用in的执行效率是一样的。
    in可以分为三类:
       
    1、形如select     *     from     t1     where     f1     in     ( 'a ', 'b '),应该和以下两种比较效率

    select     *     from     t1     where     f1= 'a '     or     f1= 'b '   
    或者     select     *     from     t1     where     f1     = 'a '     union     all     select     *     from   t1     f1= 'b '

    楼主可能指的不是这一类,这里不做讨论。   

    2、形如select     *     from     t1     where     f1     in     (select     f1     from     t2     where     t2.fx= 'x '),
    其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,
    也就是效率和exist一样。  

    3、形如select     *     from     t1     where     f1     in     (select     f1     from     t2     where     t2.fx=t1.fx),
    其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况
    和数据量多少,一般认为效率不如exists。   

    除了第一类in语句都是可以转化成exists     语句的,一般编程习惯应该是用exists而不用in.
  • 相关阅读:
    使用 ES2015 编写 Gulp 构建
    ES6 Promise 接口
    Git 文件比较
    JavaScript 属性描述符
    Vim 插件之 NERDTree
    Raspberry Pi 3 Model B 安装 OSMC
    How ADB works
    [Linux] zip 与 unzip 命令
    在 Ubuntu 配置 PPTP Server
    [Linux] 查看系统启动时间
  • 原文地址:https://www.cnblogs.com/yellowapplemylove/p/2021510.html
Copyright © 2011-2022 走看看