sqlin效率低
⑴ sql 语句中in ,not in
如果系统不自动优化,并且IN的结果很多,那么有可能IN和NOT IN的效率低些。
所有的IN都可以转换为EXISTS,同样NOT IN可以转换为NOT EXISTS,下面说明IN转换为EXISTS的方法,NOT的类似:
IN的语句:
SELECT * FROM A WHERE F IN (SELECT F FROM B)
可以转换为如下的EXISTS语句:
SELECT * FROM A WHERE EXISTS
(SELECT * FROM B WHERE A.F=B.F)
上面转换的说明:两个WHETE都可能有更多都条件,那么直接AND在相应的地方即可。另外表A和B的关联字段可能名字表同,也司没关系的。
⑵ sql in 执行效率低 如何优化
你这样不好,in,exists都是子查询
你应该考虑连接查询,这样速度快很多。
以楼上兄弟为例子:
SELECT sum(*)
FROM pas_guiyyw
WHERE exists (SELECT 1
FROM subTable
WHERE subTable.rule='ruleContext'
AND pas_guiyyw.id= subTable.id )
应该修改为:
SELECT sum(*)
FROM pas_guiyyw a,
subTable b WHERE
a.id= b.id
and b.rule='ruleContext'
这样效率高很多。
⑶ SQL优化——IN和EXISTS谁的效率更高
在SQL编程中,IN和EXISTS是常被使用的子查询方式,它们的功能相似但效率存在差异。通过对比不同场景下的测试,可以发现使用哪一种更为高效。
在测试1中,我们使用了子查询`select flag from B where B_id<100`,结果集为99条。在这个场景下,IN的效率高于EXISTS。IN执行计划中,首先执行A表的查询,并利用索引优化,然后执行B表子查询,同样使用索引。而EXISTS的执行计划则先取A表所有记录,然后逐行关联B表子查询,使用Block Nested Loop优化。
测试2中,子查询`select flag from B where B_id>100`,结果集为299899条。这次EXISTS的效率比IN高。两者在索引使用上与第一次测试一致,但当子查询结果集较大而外部表较小时,EXISTS的Block Nested Loop开始发挥优势,查询效率优于IN。
综上所述,并不能断言IN或EXISTS的效率更高,具体情况需要具体分析。IN的执行原理是先查询内表得到结果集,再与外表匹配,不管子查询是否有数据,都会进行全部匹配,这在内表数据量较大时效率较低。而EXISTS则是先对外表进行循环查询,只在匹配到数据时返回结果,适用于子查询数据量较大而外表数据量较小时。
结论是,子查询结果集较大时使用EXISTS,而结果集较小时使用IN可能更有效。对于更详细的信息和深入理解,可以参考墨天轮原文链接。
⑷ 关于sql中in 和 exists 的效率问题,in真的效率低吗
关于sql中in 和 exists 的效率问题,in真的效率低吗
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列的索引。