sql中exist和in的用法.doc

sql中exist和in的用法.doc

ID:49527580

大小:18.51 KB

页数:2页

时间:2020-03-02

sql中exist和in的用法.doc_第1页
sql中exist和in的用法.doc_第2页
资源描述:

《sql中exist和in的用法.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/notin修改为exists/notexists 修改方法如下:in的SQL语句SELECTid,category_id,htmlfile,title,convert(varchar(20),begintime,112)aspubtimeFROMtab_oa_pubWHEREis_check=1andcategory_idin(selectidfromtab_oa_pub_catewhereno=

2、'1')orderbybegintimedesc修改为exists的SQL语句SELECTid,category_id,htmlfile,title,convert(varchar(20),begintime,112)aspubtimeFROMtab_oa_pubWHEREis_check=1andexists(selectidfromtab_oa_pub_catewheretab_oa_pub.category_id=convert(int,no)andno='1')orderbybeginti

3、medesc 分析一下exists真的就比in的效率高吗?    我们先讨论IN和EXISTS。   select*fromt1wherexin(selectyfromt2)   事实上可以理解为:   select*     fromt1,(selectdistinctyfromt2)t2    wheret1.x=t2.y;   ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可

4、以很大,为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走mergejoin。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。   select*fromt1whereexists(selectnullfromt2wherey=x)   可以理解为:   forxin(select*fromt1)   loop      if(exists(selectn

5、ullfromt2wherey=x.x)      then         OUTPUTTHERECORD!      endif   endloop   ——这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。   综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。我们要根据实际的情况做相应的优化,不能绝对的说谁的效率高谁的效率低,所有的事都是

6、相对的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。