这篇文章将为大家详细讲解有关sql中in与exist效率是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联公司服务项目包括会泽网站建设、会泽网站制作、会泽网页制作以及会泽网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,会泽网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到会泽省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
一、IN 与EXISTS
1、理解
IN的执行流程
SELECT * FROM T1 WHERE X IN (SELECT Y FROM T2)
事实上可以理解为:
SELECT * FROM T1, (SELECT DISTINCT Y FROM T2) T2 WHERE T1.X =T2.Y
从这里可以看出,IN需要先处理T2表,然后再和T1进行关联
EXISTS的执行流程
SELECT *FROM T1 WHEREEXISTS (SELECTNULLFROM T2 WHEREY = X)--可以理解为:for xin (select* fromt1 ) LOOP if( exists ( selectnullfrom t2where y =x.x )THEN OUTPUTTHE RECORD endifend loop |
从这里看出,EXISXTS会先查询T1表,然后再LOOP处理T2表
2、结论
对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了。
综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
二、NOT IN 与NOT EXISTS
1、理解
NOT IN的执行流程
SELECT * FROM T1 WHERE X NOT IN (SELECT Y FROM T2)
事实上可以理解为:
SELECT * FROM T1, (SELECT DISTINCT Y FROM T2) T2 WHERE T1.X !=T2.Y
NOT EXISTS的执行流程
SELECT .. ... FROMROLLUP R WHERE NOTEXISTS (SELECT'Found' TITLE TWHERE R.SOURCE_ID = T.TITLE_ID);--可以理解为:for xin (select* fromrollup ) loop if(not exists ( that query ) ) then OUTPUT endif; end; |
注意:NOT EXISTS 与 NOT IN不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。具体见:in/exists和notin/not exists语意探讨
2、结论
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用notin,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hashjoin.如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用或者外连接+isnull.一般情况下建议使用not exists
--比如:SELECT .. .... FROMROLLUP R WHERE NOTEXISTS (SELECT'Found'
FROMTITLE TWHERE R.SOURCE_ID = T.TITLE_ID);--改成SELECT .. .... FROMTITLE T, ROLLUPR WHERE R.SOURCE_ID =T.TITLE_ID(+) ANDT.TITLE_ID
ISNULL;--或者SELECT.... .. FROMROLLUP R WHERE OURCE_IDNOT
IN (SELECTOURCE_IDFROM TITLE TWHERE OURCE_ID
ISNOT NULL);
关于“sql中in与exist效率是怎么样的”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
分享题目:sql中in与exist效率是怎么样的
本文URL:http://www.jxjierui.cn/article/pogehj.html


咨询
建站咨询
