哪些查询更有效?

时间:2010-05-28 17:22:13

标签: sql database performance

哪些查询效率更高?

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
        )

5 个答案:

答案 0 :(得分:1)

查看解释计划和/或探查器输出。另外,衡量它。使用绑定变量和重复运行来测量它。

答案 1 :(得分:0)

我个人会说第二个查询。

首先,它直接查询表Items并在此表的字段上使用 WHERE 子句进行过滤。

其次,它只使用一个其他子查询,而不是两个。

最后,第二个示例结束时只执行两个查询,第一个示例执行三个查询。

许多查询总是比为数据库引擎管理的查询更便宜。除非您执行 EXISTS 验证而不是表关节。联合比 EXISTS 子句更昂贵。

答案 2 :(得分:0)

我认为第二个更快,因为与第一个相反,sysibm.sysdummy1表不需要解析

答案 3 :(得分:0)

从简单的角度来看,我希望查询2运行得更快,因为它涉及更少的查询,但正如Hank指出的那样,通过Profiler运行它是最好的方法。

答案 4 :(得分:0)

如果items包含多个new = 1元素,它们将产生不同的结果。 exists只会检查与条件匹配的第一条记录。因此,如果在实际查询中您没有itemsstatus之间的关系(如您的示例所示),我会投票给第一个变体。

P.S。通常,当我只需要一个结果时,我会使用SELECT 1 WHERE 2==2。如果我需要更多SELECT 1 UNION SELECT 2