为什么DATEADD会降低SQL查询的速度?

jin*_*ing 7 t-sql sql-server performance

在我的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))
Run Code Online (Sandbox Code Playgroud)

此命令非常慢,需要几分钟,基于性能分析器的估计子树成本为2800.

另一方面,如果我手动计算范围,则查询非常快(估计子树成本 = 0.5,查询时间<1秒):

SELECT Application FROM commandcip 
WHERE 
    commandname = 'RunTestCase' AND 
    createdate BETWEEN '2014-02-15 03:34:16' AND '2014-02-15 03:34:18'
Run Code Online (Sandbox Code Playgroud)

我验证了两个命令都返回了正确的数据.我验证了我的DATEADD命令返回正确的日期.我也试图让DATEADD一步迟早(成独立的变量@mindate,@maxdate),但它并没有帮助.

如何在不手动计算范围的情况下加速第一次查询?

Mar*_*ith 4

对于createdate BETWEEN '2014-02-15 03:34:16' AND '2014-02-15 03:34:18'文字值,可以在列统计信息中查找以估计将匹配的行数。

除非您使用,否则不会嗅探变量的值,option (recompile)因此 SQL Server 将仅使用启发式方法来猜测数字。

据推测,使用第一个数字得出的计划与使用第二个数字得出的计划不同。

例如,一个估计较少的行并使用带有查找的非覆盖索引,另一个则使用完整扫描,因为估计的行数高于该选项被认为更便宜的临界点。