我遇到了一个奇怪的情况,附加OPTION (RECOMPILE)
到我的查询会导致它在半秒内运行,而省略它会导致查询花费超过五分钟。
当从查询分析器或我的 C# 程序通过SqlCommand.ExecuteReader()
. 打电话(或不打电话)DBCC FREEPROCCACHE
或DBCC dropcleanbuffers
没有区别;查询结果总是会在OPTION (RECOMPILE)
超过五分钟后立即返回。始终使用相同的参数调用查询 [为了这个测试]。
我正在使用 SQL Server 2008。
我对编写 SQL 相当满意,但以前从未OPTION
在查询中使用过命令,并且在浏览此论坛上的帖子之前对计划缓存的整个概念并不熟悉。我从帖子中了解到这OPTION (RECOMPILE)
是一项昂贵的操作。它显然为查询创建了一个新的查找策略。那么,为什么省略 的后续查询OPTION (RECOMPILE)
如此缓慢呢?后续查询不应该使用在先前调用中计算的包含重新编译提示的查找策略吗?
每次调用都需要重新编译提示的查询是不是很不寻常?
对不起,入门级的问题,但我真的不能做出正面或反面。
更新:我被要求发布查询...
select acctNo,min(date) earliestDate
from(
select acctNo,tradeDate as date
from datafeed_trans
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_money
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_jnl
where feedid=@feedID and feedDate=@feedDate
)t1
group by t1.acctNo
OPTION(RECOMPILE)
从查询分析器运行测试时,我在前面加上以下几行:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
从我的 C# 程序调用它时,参数是通过SqlCommand.Parameters
属性传入的。
出于本讨论的目的,您可以假设参数永远不会改变,因此我们可以排除次优参数异味的原因。