SqlServer中in和exists的区别效率问题

如题所述

in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

如果两个表中一个较小,一个是大表,则子查询表大的用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'
的结果是相同的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-09-26
SqlServer中in和exists的区别效率问题
in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

如果两个表中一个较小,一个是大表,则子查询表大的用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个回答  2017-09-26
in和existsin是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select*fromAw本回答被提问者采纳

SqlServer中in和exists的区别效率问题
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)效率低,用到了A表上cc...

实测:SQL Server中 in和exists哪个效率高?
测试结果显示,IN语句和EXISTS语句在执行时间和IO操作方面差异不大。执行计划显示,两个SQL语句均采用右半连接。综上,IN语句和EXISTS语句在本测试中展现出相似的效率。如有疑问或错误,欢迎讨论。

sql server 嵌套查询语句中什么时候用in,什么时候又用exists!
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。所以当有多重循环,使用in更合适,效率越高。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。NOT EXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联...

SQLSERVER语句 in和exists哪个效率高本人测试证明
大家可以看到除了执行时间有一点差别,IO是一样的因为数据量比较大,所以两个查询都用到了Worktable(中间表)来存储中间结果IN语句的执行计划从执行计划可以看到两个SQL语句的开销都是一样的,而且大家都使用了右半连接(Right Semi Join)

SQLSERVER语句 in和exists哪个效率高本人测试证明
上面的SQL语句IN里面又有NOT EXISTS 这样的情况很难测试同等条件下IN语句和EXISTS语句的效率 还有一个非SARG运算符 在《SQLSERVER企业级平台管理实践》的第424页里提到:SQLSERVER对筛选条件(search argument\/SARG)的写法有一定的建议 对于不使用SARG运算符的表达式,索引是没有用的,SQLSERVER对它们很难...

sql server中not in,in与not exists,exists有什么不同
in和not in的用法,更多会出现在子查询中,例如 select * from student where sno in (select sno from Exam where course ='English') 查询参加了英语考试的学生信息。(3)exists 更多时候出现在if判断中, 它只做一个是或否的判断,例如如果存在birthday=今天的学生,那么就把他的age+1 if ...

使用EXISTS关键字引入的子查询与IN关键字引入的子查询在语法上有哪些...
EXISTS存在一个所谓的’短路功能‘,也就是这个谓词只关系是否存在记录 如客户表 TCustomer 订单表 TOrders 关联关系FCustomerId 那么要检测存在有订单的客户可以 SELECT * FROM TCustomer WHERE FCustomerID IN(SELECT FCustomerID FROM TOrders)或 SELECT * FROM TCustomer WHERE FCustomerID EXISTS(...

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为什么
in子查询、exists子查询、连接,效率的探讨 以下是SQL的帮助 (高级查询优化概念)Microsoft® SQL Server™ 2000 使用内存中的排序和哈希联接技术执行排序、交集、联合、差分等操作。SQL Server 利用这种类型的查询计划支持垂直表分区,有时称其为分列存储。SQL Server 使用三种类型的联接操作:嵌...

SQL Server数据库的高性能优化经验总结
EXISTS要远比IN的效率高。里面关系到full table scan和range scan。几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。4、在海量查询时尽量少用格式转换。5、当在SQL SERVER 2000中 如果存储过程只有一个参数,并且是OUTPUT类型的,必须在调用这个存储过程的时候给这个参数一个初始的值,否则会出现...

如何解决SQL Server数据库查询速度慢
相同 的是IS NULL,“NOT", "NOT EXISTS", "NOT IN"能优化她,而”<>“等还是不能优化,用不到索引。 23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL.一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。 24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明...

相似回答