0

我在 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 字段的索引。而且我可以从管理工作室运行这两个查询,所以不能从那里进行太多实验。

4

1 回答 1

2

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

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

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

于 2013-08-28T13:50:01.257 回答