zoukankan      html  css  js  c++  java
  • Oracle select in/exists/not in/not exits

    -关键字 in/exists/not in/not exits

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
    一直以来认为exists比in效率高的说法是不准确的。
    如果查询的两个表大小相当,那么用in和exists差别不大。

    如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

    例如:表A(小表),表B(大表)
    1:
    select * from A where cc in (select cc from B)
    效率低,用到了A表上cc列的索引;
    select * from A where exists(select cc from B where cc=A.cc)
    效率高,用到了B表上cc列的索引。
    相反的
    2:
    select * from B where cc in (select cc from A)
    效率高,用到了B表上cc列的索引;
    select * from B where exists(select cc from A where cc=B.cc)
    效率低,用到了A表上cc列的索引。
    not in 和not exists
    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
    而not extsts 的子查询依然能用到表上的索引。
    所以无论那个表大,用not exists都比not in要快。

    in 与 =的区别

    select name from student where name in ('zhang','wang','li','zhao');

    select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

    的结果是相同的。
    -----------------------------------------------------------------实例
    --登陆 执行以下语句,注意执行时间
    ---小表
    er_street_code
    select distinct tt.gkdm from er_street_code tt where tt.gkdm is not null
    ---大表
    er_in_detail,er_reck_detail

    ---例1
    select * from er_reck_detail t1 where t1.gkdm in (select gg.gkdm from er_street_code gg)

    select * from er_reck_detail t1 where exists (select * from er_street_code gg where t1.gkdm=gg.gkdm)

    ---例2
    select * from er_street_code aa where aa.gkdm in (select mm.gkdm from er_reck_detail mm)

    select * from er_street_code aa where exists (select * from er_reck_detail mm where mm.gkdm=aa.gkdm)

    ---例3
    select * from er_reck_detail t1 where t1.gkdm in (select t2.gkdm from er_in_detail t2)

    select * from er_reck_detail t1 where exists (select * from er_in_detail t2 where t1.gkdm=t2.gkdm)

  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400530.html
Copyright © 2011-2022 走看看