zoukankan      html  css  js  c++  java
  • 关于sql中in 和 exists 的效率问题

    在用in的地方可以使用freemark标签代替,例如:

    <#if assistantList??&& (assistantList?size > 0)>
      AND (c.uid = ${uid} OR c.course_id IN (<#list assistantList as item> ${item} <#if item_has_next>,</#if></#list>))
    <#else>
      AND c.uid = ${uid}
    </#if>

    改为

    <#if assistantList??&& (assistantList?size > 0)>
      AND (c.uid = ${uid} OR (<#list assistantList as item>c.course_id = ${item}<#if item_has_next> OR </#if></#list>))
    <#else>
      AND c.uid = ${uid}
    </#if>

    对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

    在网上看到很多关于sql中使用in效率低的问题,于是自己做了测试来验证是否是众人说的那样。

    群众:

    对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。


    这里我找到两张表,一个是用户信息表[INDIVIDUAL] 47万条数据,一个状态类型表[STATUS] 88条数据,对应上面所述的一多一少



    然后进行两种查询 (not exists 和 not in一组)(exists 和 in一组)
    select * from STATUS s where not exists(select 1 from INDIVIDUAL i where i.STATUS_ID=s.STATUS_ID)
    
    select * from STATUS s where s.STATUS_ID not in(select i.STATUS_ID from INDIVIDUAL i )
    select * from STATUS s where  exists(select 1 from INDIVIDUAL i where i.STATUS_ID=s.STATUS_ID)
    
    select * from STATUS s where s.STATUS_ID  in(select i.STATUS_ID from INDIVIDUAL i )
    
    

    查看执行计划后发现,结果貌似是一样的,令人意外,可能大家认为in 比较慢的原因就是 IN先执行子查询 ,但是事实并不是这样的。





    但是如果你使用join,就会发现真的对用户表全盘扫描了.....

    
    
  • 相关阅读:
    salesforce零基础学习(九十七)Big Object
    关于linux 终端的小命令
    小知识点 之 JVM -XX:MaxGCPauseMillis 与 -XX:GCTimeRatio
    查看SAP HANA数据库最大连接数
    解决Failed to launch preferred application for category TerminalEmulator. Failed to execute child process /usr/lib/x86_64-linux-gnu/xfce4/exo-1/exo-helper-1 (No such file or directory)
    RxJava简析
    《UNIX编程艺术》学习1
    windows下的 长路径
    为什么说「动态类型一时爽,代码重构火葬场」?-强、弱,静态、动态 类型对比
    分布式系统概述(Hadoop与HBase的前生今世)
  • 原文地址:https://www.cnblogs.com/zhouj850/p/8321506.html
Copyright © 2011-2022 走看看