SQL中IN跟EXISTS到底哪个更快
发布时间:2010-06-05 14:18:49 文章来源:www.iduyao.cn 采编人员:星星草
SQL中IN和EXISTS到底哪个更快
我有几个查询用到了in ,然后有人告诉我exists 比 in 快 又有人说一样的 到底哪个更快
------解决方案--------------------
sql in与exists区别
IN
确定给定的值是否与子查询或列表中的值相匹配。
EXISTS
指定一个子查询,检测行的存在。
比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。
USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO
-- Or, using the IN clause:
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO
下面是任一查询的结果集:
pub_name
----------------------------------------
Algodata Infosystems
New Moon Books
(2 row(s) affected)
exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P 表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时 为真
in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
全文:
in和exists
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'
的结果是相同的。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
使用javaService将java Application程序注册成windows系统服务,程序中调用的文件路径问题
我写的application程序,原来是在linux下...
-
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]l??ռ?ߵ?????һ?? hstmt
取数据库tableName的字段的名字时出现上...
-
Java线程优先级抢占问题
java中,使线池中的一个当前运行的线程阻塞,运行优先级高的线程,待高优先级线程运行完毕后,再运行刚才被阻塞...
-
JAVA女实习生适合编程及未来发展?
我是大四的 我还有一个月就要去北京当java实习生了 对编程还是有些兴趣了 因为是本专业 而且我...
-
这个怎么运行不成?请哪位大侠帮一下,谢谢!
public class Employee{
private int id;
private String name;
private ...
-
请懂LOG4J的大虾进来看看
小弟最近在学log4j
现在只是知道怎么配置,什么是什么。
那到底这个东西怎么运用到一个项目中去呢
...
-
数据库问题java.sql.SQLException: Column not found,急!!!!
救命啊
我读不了数据库啊
各位大侠教教我~~
我的代码:
/...
-
关于java程序的一些问题
由于初学java,对于运行后的错误不理解,麻烦大家指教了,谢谢!
2011-9-18 14:05:48 org.apache.catalina...
-
求apache mina框架所需要的jar包
如题,哪位好心人能给我发一份一些相关jar包吧,小弟感激不尽。要是能够给我发些学习资料,就更好。
...
-
同一个类的不同实例,他们的方法是否共用一个内存空间
如题
听说一个类创建多个实例的时候,其变量是分别创建不同的内存空间来存储,...