哪些查询效率更高?
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
)
答案 0 :(得分:1)
查看解释计划和/或探查器输出。另外,衡量它。使用绑定变量和重复运行来测量它。
答案 1 :(得分:0)
我个人会说第二个查询。
首先,它直接查询表Items
并在此表的字段上使用 WHERE 子句进行过滤。
其次,它只使用一个其他子查询,而不是两个。
最后,第二个示例结束时只执行两个查询,第一个示例执行三个查询。
许多查询总是比为数据库引擎管理的查询更便宜。除非您执行 EXISTS 验证而不是表关节。联合比 EXISTS 子句更昂贵。
答案 2 :(得分:0)
我认为第二个更快,因为与第一个相反,sysibm.sysdummy1表不需要解析
答案 3 :(得分:0)
从简单的角度来看,我希望查询2运行得更快,因为它涉及更少的查询,但正如Hank指出的那样,通过Profiler运行它是最好的方法。
答案 4 :(得分:0)
如果items
包含多个new = 1
元素,它们将产生不同的结果。 exists
只会检查与条件匹配的第一条记录。因此,如果在实际查询中您没有items
和status
之间的关系(如您的示例所示),我会投票给第一个变体。
P.S。通常,当我只需要一个结果时,我会使用SELECT 1 WHERE 2==2
。如果我需要更多SELECT 1 UNION SELECT 2
。