我有一个包含两个值的表:
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秒。
谁能告诉我我做错了什么?
答案 0 :(得分:4)
这称为参数嗅探
执行使用参数的查询或存储过程时。在编译期间,将评估传递给参数的值,并将其用于创建执行计划。该值也与执行计划一起存储在计划缓存中。该计划的未来执行将重新使用使用该参考值编制的计划。
您可以通过各种方法避免这种情况。一个是
<强>重新编译强>
您可以将option(Recompile)
添加到查询中,以便每次编译查询时都会生成新的执行计划
select top(1) ciid, businessdate
from checkitemsales
where businessdate = @var1
OPTION (RECOMPILE);
缺点
其他方法
检查以下有关上述所有方法的详细信息
答案 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)