表现在这两个SQL场景
问题描述:
我曾以为下面的第一个电话是更有效,因为它不仅使该检查一次,看是否@myInputParameter
小于5000表现在这两个SQL场景
如果检查失败,我避免完全查询。不过,我已经看到其他人的代码就像第二个例子一样,说这个代码效率很高,甚至更高。
谁能告诉我哪个更快?看起来第二个会慢很多,特别是如果这个调用正在梳理大数据集。
第一次调用:
IF (@myInputParameter < 5000)
BEGIN
SELECT
@myCount = COUNT(1)
FROM myTable
WHERE [email protected]
AND someOtherColumn='Hello'
--and so on
END
第二个电话:
SELECT
@myCount = COUNT(1)
FROM myTable
WHERE [email protected]
AND someOtherColumn='Hello'
AND @myInputParameter < 5000
--and so on
编辑:我使用的是SQL Server 2008 R2的,但我真的问到感受一下它的查询是“最佳实践“。我敢肯定,这两个陈述之间的查询时间差异是千分之一秒,所以它不是那么重要。我只是对编写更好的SQL代码感兴趣。谢谢
答
SQL Server设计良好。它将进行字面评估,如果不需要实际扫描表/索引。所以,我希望他们的表现基本一致。
从实践的角度来看,我认为应该使用if语句,特别是如果它包装多个语句。但是,这实际上是对我的偏好问题。对我而言,无法执行的代码在逻辑上会比没有实际触及数据时“应该”执行的代码更快。
此外,SQL Server应该创建一个错误的计划并实际执行命中数据的可能性。我从来没有见过文字这个特定的场景,但我制定了不好的执行计划。
答
有时,SQL Server很聪明,可以将后者转换为前者。这在一些计划运算符(如过滤器或循环连接)中表现为“启动谓词”。这会导致查询在很短的时间内以非常快的速度进行评估。我刚刚测试了这个,顺便说一句。
你不能依赖于所有的查询,但一旦通过测试证明它适用于特定的查询,我会依赖它。
如果使用OPTION (recompile)
,它会变得更可靠,因为此选项将参数值内联到查询计划中,从而导致整个查询转变为恒定扫描。