[英]Which of these queries is more efficient?
这些查询中哪个更有效?
select 1 as newAndClosed
from sysibm.sysdummy1
where exists (
select 1
from items
where new = 1
)
and not exists (
select 1
from status
where open = 1
)
select 1 as newAndClosed
from items
where new = 1
and not exists (
select 1
from status
where open = 1
)
查看说明计划和/或探查器输出。 另外,对其进行测量。 使用绑定变量和重复运行对其进行测量。
我个人会说第二个查询。
首先,它直接查询表Items
,并在该表的字段上使用WHERE子句进行过滤。
第二,它只使用一个子查询,而不是两个。
最后,当第一个示例执行三个查询时,第二个示例结束仅执行两个查询。
对于数据库引擎而言,许多查询总是比较少的查询更昂贵。 除非您执行EXISTS验证,而不是执行表联接。 关节比EXISTS子句昂贵。
我认为第二个更快,因为与第一个相反,sysibm.sysdummy1表不需要解析
从简单的角度来看,我希望查询2可以运行得更快,因为它涉及的查询更少,但是正如Hank指出的那样,最好通过Profiler运行它。
如果items
包含多个元素且new = 1
则它们将产生不同的结果。 exists
只会检查符合条件的第一条记录。 因此,我投票赞成第一个变体,如果在实际查询中您没有items
和status
之间的关系(如您的示例)。
PS:当我从任何地方只需要一个结果时,通常使用SELECT 1 WHERE 2==2
。 如果我需要更多的SELECT 1 UNION SELECT 2
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.