这两种SQL场景的性能

时间:2012-11-30 20:22:08

标签: sql sql-server-2008-r2 sqlperformance

我认为下面的第一个电话效率更高,因为它只会检查一次是否@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代码。感谢

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

从实践的角度来看,我认为应该使用if语句,特别是如果它包含多个语句。但是,这真的是我的偏好问题。对我来说,无法执行的代码在逻辑上会比“应该”执行而不实际访问数据的代码更快。

此外,SQL Server可能会创建一个错误的计划并实际执行命中数据。我从未见过这种具有文字的特定场景,但我已经创建了糟糕的执行计划。