相关疑难解决方法(0)

OPTION(RECOMPILE)总是更快; 为什么?

我遇到了一个奇怪的情况,附加OPTION (RECOMPILE)到我的查询导致它在半秒内运行,而省略它会导致查询花费超过五分钟.

从查询分析器或我的C#程序执行查询时就是这种情况SqlCommand.ExecuteReader().打电话(或不打电话)DBCC FREEPROCCACHEDBCC 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)
Run Code Online (Sandbox Code Playgroud)

从查询分析器运行测试时,我预先添加以下行:

declare @feedID int
select @feedID=20

declare …
Run Code Online (Sandbox Code Playgroud)

sql sql-server compilation hint sql-server-2008

156
推荐指数
3
解决办法
17万
查看次数

为什么通过ADO.NET执行的存储过程比SQL Server Management Studio花费许多倍的时间?

我有一个正在从超时的旧版ASP.NET WebForms应用程序执行的存储过程。该CommandTimeout属性被设置为6分钟。该存储过程查询一个表中有1500万行,并联接到其他表...。因此它很慢。但是,它仅返回20行,因此此处的网络性能不是问题。

var data = new DataSet();

using (var connection = GetConnection())
using(var command = connection.CreateCommand())
using(var dataAdapter = new SqlDataAdapter(command))
{
   command.CommandTimeout = 360;
   command.CommandType = CommandType.StoredProcedure;
   command.CommandText = "praGetTradesForProductIdReassignment";
   command.Parameters.AddWithValue("@int4_TradeId", (object)tradeId ?? DBNull.Value);
   command.Parameters.AddWithValue("@int4_FeedId", (object)feedId ?? DBNull.Value);
   command.Parameters.AddWithValue("@int4_SystemId", (object)systemId ?? DBNull.Value);
   command.Parameters.AddWithValue("@int4_TradeCode", (object)tradeCode ?? DBNull.Value);
   command.Parameters.AddWithValue("@int4_ProductID", (object)productId ?? DBNull.Value);
   command.Parameters.AddWithValue("@sortColumn", sortColumn);
   command.Parameters.AddWithValue("@sortDirection", sortDirection);
   command.Parameters.AddWithValue("@pageIndex", pageIndex);
   command.Parameters.AddWithValue("@pageSize", pageSize);

   dataAdapter.Fill(data);                
}

return data;
Run Code Online (Sandbox Code Playgroud)

当我在SQL Server Management Studio中使用相同的参数执行相同的存储过程时,它将在大约50秒后成功完成。

我已经使用Profiler运行了SQL跟踪,它显示ADO.NET执行的时间比SQL Server Management Studio的执行时间长(50 vs 356秒)。

  <Events>
    <Event id="13" name="SQL:BatchStarting">
      <Column …
Run Code Online (Sandbox Code Playgroud)

c# t-sql sql-server ado.net

2
推荐指数
1
解决办法
1550
查看次数

标签 统计

sql-server ×2

ado.net ×1

c# ×1

compilation ×1

hint ×1

sql ×1

sql-server-2008 ×1

t-sql ×1