0

我假设下面的第一个调用更有效,因为它只进行一次检查以查看是否@myInputParameter小于 5000。

如果检查失败,我会完全避免查询。但是,我看到其他人像第二个示例一样编写代码,说它同样有效,甚至更多。

谁能告诉我哪个更快?似乎第二个会慢得多,特别是如果调用是通过大型数据集进行梳理。

第一次调用:

IF (@myInputParameter < 5000)
    BEGIN
        SELECT 
            @myCount = COUNT(1) 
        FROM myTable 
        WHERE someColumn=@someInputParameter
            AND someOtherColumn='Hello'

        --and so on
    END

第二次调用:

SELECT 
    @myCount = COUNT(1) 
FROM myTable 
WHERE someColumn=@someInputParameter
    AND someOtherColumn='Hello'
    AND @myInputParameter < 5000

--and so on

编辑:我使用的是 SQL Server 2008 R2,但我真的想了解哪个查询是 SQL 的“最佳实践”。我确信这两个语句之间的查询时间差异是千分之一秒,所以它不是那么关键。我只是对编写更好的 SQL 代码感兴趣。谢谢

4

2 回答 2

1

有时,SQL Server 足够聪明,可以将后者转换为前者。这表现为某些计划运算符(如过滤器或循环连接)上的“启动谓词”。这会导致查询在很小的恒定时间内快速评估。我刚刚测试了这个,顺便说一句。

您不能对所有查询都依赖它,但是一旦通过测试验证它适用于特定查询,我就会依赖它。

如果使用OPTION (recompile)它会变得更加可靠,因为此选项将参数值内联到查询计划中,从而导致整个查询变成持续扫描。

于 2012-11-30T20:35:44.903 回答
0

SQL Server 设计得很好。如果不需要,它将在不实际扫描表/索引的情况下进行文字评估。所以,我希望它们的表现基本相同。

从实践的角度来看,我认为应该使用 if 语句,特别是如果它包含多个语句。但是,这对我来说确实是一个偏好问题。对我来说,无法执行的代码在逻辑上比“应该”在没有实际命中数据的情况下执行的代码要快。

Also, there is the possibility that SQL Server should create a bad plan and actually do a hit the data. I've never seen this specific scenario with literals, but I've had bad execution plans be created.

于 2012-11-30T20:38:18.033 回答