zoukankan      html  css  js  c++  java
  • 【转】SQL里的EXISTS与in、not exists与not in

    代码
    系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists



    修改方法如下:

    in的SQL语句

    SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
    FROM tab_oa_pub WHERE is_check=1 and
    category_id
    in (select id from tab_oa_pub_cate where no='1')
    order by begintime desc

    修改为exists的SQL语句
    SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
    FROM tab_oa_pub WHERE is_check=1 and
    exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1')
    order by begintime desc



    分析一下exists真的就比in的效率高吗?



    我们先讨论IN和EXISTS。
    select * from t1 where x in ( select y from t2 )
    事实上可以理解为:
    select *
    from t1, ( select distinct y from t2 ) t2
    where t1.x = t2.y;
    ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大,为什么呢?最通俗的理解就是因为t1.x
    =t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走merge join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。
    select * from t1 where exists ( select null from t2 where y = x )
    可以理解为:
    for x in ( select * from t1 )
    loop
    if ( exists ( select null from t2 where y = x.x )
    then
    OUTPUT THE RECORD!
    end if
    end loop
    ——这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y
    =x.x可以走t2.y的索引。
    综合以上对IN
    /EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。


    我们要根据实际的情况做相应的优化,不能绝对的说谁的效率高谁的效率低,所有的事都是相对的

    转自:http://www.cnblogs.com/zwl12549/archive/2007/04/19/720028.html

  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/gebenhagen/p/1685107.html
Copyright © 2011-2022 走看看