SQL变量返回的时间比静态值长

时间:2016-10-11 01:07:29

标签: sql sql-server datetime variables

我有一个包含两个值的表:

ciid, businessdate

ciid是主键,并且已启用自动增量。 businessdate(datetime)由另一个进程插入。

给出以下查询:

select top(1) ciid, businessdate
from checkitemsales 
where businessdate='10/9/16 00:00:00:000'

返回只需1.2秒,而此查询:

declare @var1 datetime

set @var1='10/9/16 00:00:00:000'

select top(1) ciid, businessdate
from checkitemsales
where businessdate = @var1

返回需要5.6秒。

谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:4)

这称为参数嗅探

执行使用参数的查询或存储过程时。在编译期间,将评估传递给参数的值,并将其用于创建执行计划。该值也与执行计划一起存储在计划缓存中。该计划的未来执行将重新使用使用该参考值编制的计划。

您可以通过各种方法避免这种情况。一个是

<强>重新编译

您可以将option(Recompile)添加到查询中,以便每次编译查询时都会生成新的执行计划

select top(1) ciid, businessdate
from checkitemsales
where businessdate = @var1
OPTION (RECOMPILE);

缺点

  • 查询经常运行。
  • CPU资源有限。
  • 查询性能的某些差异是可以接受的。

其他方法

  • 优化价值
  • 优化未知
  • 例外

检查以下有关上述所有方法的详细信息

sp_BlitzCache™ Result: Parameter Sniffing

Parameter Sniffing

答案 1 :(得分:1)

declare @var1 datetime

set @var1='10/9/16 00:00:00:000'

select top(1) ciid, businessdate
from checkitemsales
where (businessdate = @var1) option (recompile)

尝试这个,让我知道结果,它可能会更快

答案 2 :(得分:0)

你能尝试这种方法吗?

declare @var1 datetime
set @var1='10/9/16 00:00:00:000'

declare @cmd varchar(max) = 'select top(1) ciid, businessdate
from #table
where businessdate = ''' + CONVERT(VARCHAR(10), @var1, 1) + ' '  + convert(VARCHAR(12), @var1, 114) + ''''

EXEC (@cmd)