我认为下面的第一个电话效率更高,因为它只会检查一次是否@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代码。感谢
答案 0 :(得分:1)
有时,SQL Server足够聪明,可以将后者转换为前者。这表现为某个计划运算符的“启动谓词”,如过滤器或循环连接。这会导致查询在很小的恒定时间内非常快速地进行评估。我刚试过这个,顺便说一句。
您不能依赖于所有查询,但一旦通过测试验证它适用于特定查询,我就会依赖它。
如果使用OPTION (recompile)
,它会变得更加可靠,因为此选项会将参数值内联到查询计划中,从而导致整个查询变为常量扫描。
答案 1 :(得分:0)
SQL Server设计得很好。它将进行文字评估,而不实际扫描表/索引,如果它不需要。所以,我希望它们的表现基本相同。
从实践的角度来看,我认为应该使用if语句,特别是如果它包含多个语句。但是,这真的是我的偏好问题。对我来说,无法执行的代码在逻辑上会比“应该”执行而不实际访问数据的代码更快。
此外,SQL Server可能会创建一个错误的计划并实际执行命中数据。我从未见过这种具有文字的特定场景,但我已经创建了糟糕的执行计划。