【发布时间】:2014-02-27 07:53:48
【问题描述】:
在我的 SQL Server 查询中,我尝试获取 2 秒的数据范围:
DECLARE @runtime AS datetime
SELECT @runtime = '2014-02-15 03:34:17'
SELECT Application FROM commandcip
WHERE
commandname = 'RunTestCase' AND
(createdate BETWEEN DATEADD(s, -1, @runtime) AND DATEADD(s, 1, @runtime))
这个命令非常慢,需要几分钟,基于性能分析器的估计子树成本是 2800。
另一方面,如果我手动计算范围,查询速度非常快(估计子树成本 = 0.5,查询时间
SELECT Application FROM commandcip
WHERE
commandname = 'RunTestCase' AND
createdate BETWEEN '2014-02-15 03:34:16' AND '2014-02-15 03:34:18'
我验证了这两个命令都返回了正确的数据。我验证了我的DATEADD 命令返回正确的日期。我也试图让DATEADD 早一步(进入单独的变量@mindate,@maxdate),但它没有帮助。
如何在不手动计算范围的情况下加快第一次查询?
【问题讨论】:
-
比较执行计划。
-
使用
option (recompile)允许嗅探变量的值而不是猜测。如果您仍然看到计划中的差异see this -
谢谢。选项(重新编译)并没有改进估计计划,但它改进了查询时间......这是重点。如果您将其添加为答案,我会将其标记为已接受。
-
@jing - 您需要查看实际执行计划,而不是估计。在估计没有分配过
SELECT @runtime = '2014-02-15 03:34:17',所以第二个计划的估计仍然不会使用它。 -
执行计划比较确认了建议:没有选项(重新编译)它执行昂贵的聚集索引扫描,它使用未指定的@runtime。更快的查询使用 Index Seek 来获取确切的日期。感谢您的解决方案。
标签: sql-server performance tsql