我遇到了一种奇怪的情况,将OPTION (RECOMPILE)
附加到我的查询后,它会在半秒内运行,而忽略它会导致查询花费5分钟以上的时间。
当从query Analyzer或通过SqlCommand.ExecuteReader()
从我的C#程序执行查询时,就是这种情况。调用(或不调用) DBCC FREEPROCCACHE
或DBCC dropcleanbuffers
没有区别;使用OPTION (RECOMPILE)
时,查询结果总是即时返回,如果不调用,则返回时间长于5分钟。出于此测试的目的,总是使用相同的参数调用查询。
我使用的是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)
当从Query Analyzer运行测试时,我预先考虑了以下几行:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
当从我的C#程序调用它时,参数是通过SqlCommand.Parameters
属性传入的。
出于本文讨论的目的,您可以假设参数永远不会改变,因此我们可以排除次优的参数嗅觉作为原因。
https://stackoverflow.com/questions/20864934
复制相似问题