我遇到了一种奇怪的情况,将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
属性传入的。
出于本文讨论的目的,您可以假设参数永远不会改变,因此我们可以排除次优的参数嗅觉作为原因。
发布于 2014-01-01 11:41:03
有些时候,使用OPTION(RECOMPILE)
是有意义的。根据我的经验,只有在使用动态SQL时,这才是可行的选择。在您探索这在您的情况下是否有意义之前,我建议重新构建您的统计数据。这可以通过运行以下命令来完成:
EXEC sp_updatestats
然后重新创建你的执行计划。这将确保在创建执行计划时,它将使用最新信息。
每次执行查询时,添加OPTION(RECOMPILE)
都会重新构建执行计划。我从来没有听说过它被描述为creates a new lookup strategy
,但也许我们只是对同一件事使用了不同的术语。
在创建存储过程时(我怀疑您是从.NET调用即席sql,而不是从if you are using a parameterized query then this ends up being a stored proc call调用),SQL Server会尝试根据数据库中的数据和传入的参数(parameter sniffing)来确定此查询的最有效执行计划,然后缓存此计划。这意味着,如果您在数据库中有10条记录的情况下创建查询,然后在有100,000,000条记录时执行该查询,则缓存的执行计划可能不再是最有效的。
总而言之,我看不出OPTION(RECOMPILE)
在这里有什么好处。我怀疑你只需要更新你的统计数据和你的执行计划。根据您的情况,重新构建统计信息可能是DBA工作的重要部分。如果你在更新你的统计数据后仍然有问题,我建议你发布两个执行计划。
回答你的问题-是的,我想说的是,你的最佳选择是在每次执行查询时重新编译执行计划,这是非常不寻常的。
发布于 2014-05-30 04:34:08
通常,当查询的运行与运行之间存在巨大差异时,我发现这通常是5个问题之一。
通常,在编写查询时,您应该对某些数据在表中的大致分布情况有一定的了解。例如,一列可以具有均匀分布的不同值的数量,也可以是倾斜的,80%的时间具有一组特定的值,无论分布是随时间频繁变化还是相当静态。这将使您更好地了解如何构建高效的查询。而且在调试查询性能时具有建立关于其为什么缓慢或低效的假设的基础。
发布于 2015-10-04 09:52:53
为了添加到选项(重新编译)可能非常有用的情况的优秀列表(由@CodeCowboyOrg给出),
https://stackoverflow.com/questions/20864934
复制相似问题