我遇到了一种奇怪的情况,将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属性传递。
为了便于讨论,您可以假设参数永远不会改变,因此我们可以排除次佳的参数气味是造成这种情况的原因。
慕少森
相关分类