繁体   English   中英

这些查询中哪个更有效?

[英]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只会检查符合条件的第一条记录。 因此,我投票赞成第一个变体,如果在实际查询中您没有itemsstatus之间的关系(如您的示例)。

PS:当我从任何地方只需要一个结果时,通常使用SELECT 1 WHERE 2==2 如果我需要更多的SELECT 1 UNION SELECT 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM