条件超时的地方

时间:2013-08-28 12:53:42

标签: .net sql sql-server

我在sql server 2008 r2 db中有一个查询,它是使用SqlCommand从C#执行的:

SELECT ob.*, ob2.*
FROM Orderbook ob 
LEFT JOIN Instruments i ON ob.InstrumentId = i.id AND i.TypeId = 4 
LEFT JOIN Instruments i2 ON i.UnderlyingId = i2.id 
LEFT JOIN Orderbook ob2 ON ob2.InstrumentId = i2.id AND ob.Moment = ob2.Moment 
WHERE /*ob.Moment > @sinceDateTime AND*/ i.CodeId = 9 AND DATEPART(minute, ob.Moment) = 0 
ORDER BY ob.Moment

在WHERE子句中使用注释条件运行正常。但是当我取消注释它时,我从服务器获得超时。这让我感到困惑 - 从一开始就获得记录的查询运行正常,但是当我想获取今天的记录时,我才会超时。有什么建议在哪里看?

Orderbook表在Moment字段上有一个聚簇索引,在InstrumentId上有常规索引。 Instruments表具有Id和UnderlyingId字段的索引。 我可以从管理工作室运行两个查询,因此无法从那里进行实验。

1 个答案:

答案 0 :(得分:2)

这听起来像是“参数嗅探”的经典案例。尝试在查询结尾处添加OPTION(RECOMPILE),看看它是否有效。

以下是有关该问题的更多信息(如果是问题): http://www.sommarskog.se/query-plan-mysteries.html

要点是SQL服务器编译并缓存一个对所使用的第一个参数有利的计划,但可能对以后的参数不利。在SSMS中返回并运行它,连接通常具有不同的选项集,因此它不会使用该缓存的计划。