首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >选项(重新编译)总是更快;为什么?

选项(重新编译)总是更快;为什么?
EN

Stack Overflow用户
提问于 2014-01-01 09:59:29
回答 6查看 245K关注 0票数 200

我遇到了一种奇怪的情况,将OPTION (RECOMPILE)附加到我的查询后,它会在半秒内运行,而忽略它会导致查询花费5分钟以上的时间。

当从query Analyzer或通过SqlCommand.ExecuteReader()从我的C#程序执行查询时,就是这种情况。调用(或不调用) DBCC FREEPROCCACHEDBCC dropcleanbuffers没有区别;使用OPTION (RECOMPILE)时,查询结果总是即时返回,如果不调用,则返回时间长于5分钟。出于此测试的目的,总是使用相同的参数调用查询。

我使用的是SQL Server 2008。

我对编写SQL相当满意,但以前从未在查询中使用过OPTION命令,在浏览此论坛上的帖子之前,我对计划缓存的整个概念并不熟悉。我从这些帖子中理解到,OPTION (RECOMPILE)是一个昂贵的操作。显然,它为查询创建了一个新的查找策略。那么,为什么省略OPTION (RECOMPILE)的后续查询会如此缓慢呢?后续查询不应该使用在包含重新编译提示的前一次调用中计算的查找策略吗?

在每次调用时都需要重新编译提示的查询是不是很不寻常?

对于这个入门级的问题,我很抱歉,但我真的搞不懂。

更新:我被要求发布查询...

代码语言:javascript
复制
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运行测试时,我预先考虑了以下几行:

代码语言:javascript
复制
declare @feedID int
select @feedID=20

declare @feedDate datetime
select @feedDate='1/2/2009'

当从我的C#程序调用它时,参数是通过SqlCommand.Parameters属性传入的。

出于本文讨论的目的,您可以假设参数永远不会改变,因此我们可以排除次优的参数嗅觉作为原因。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20864934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档