我遇到了一种奇怪的情况 OPTION (RECOMPILE)
查询到查询中会使查询在半秒钟内运行,而省略查询会使查询花费超过五分钟的时间。
从Query Analyzer或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
属性传递。
为了便于讨论,您可以假设参数从不改变,因此我们可以排除次佳的气味。
RECOMPILE
。无论如何,请捕获执行计划并查看差异。