【问题标题】:The wait operation timed out in SQL ServerSQL Server 中的等待操作超时
【发布时间】:2014-11-05 11:53:00
【问题描述】:

我有一个包含 100 列和 2,000,000 条记录的表。当我使用存储过程从中获取记录时,有时我会收到“等待操作超时”。错误。当我更改存储过程然后尝试获取记录时,它会正常工作。

谁能告诉我最好的解决方案是什么?

SP AS 关注

CREATE PROC GetProducts @ClientId INT=NULL
AS
  BEGIN
      SELECT TOP 10 ClientId,
                    Field2,
                    Field3,
                    Field4,
                    Field5,
                    Field6,
                    Field7,
                    Field8,
                    Field9,
                    Field10
      FROM   ProductMaster
      WHERE  ClientId = @ClientId
      ORDER  BY Field1 DESC
  END 

【问题讨论】:

  • 是的。尝试按照常见问题解答将其作为一个明智的问题。没有信息的“帮帮我”是不好的。
  • 嗨 TomTom,我已经编辑了问题并给出了我遇到问题的 sp。
  • 您有关于 ProductMaster 的任何索引吗?可能有助于发布您的架构。
  • FROM ProductMaster WHERE ClientId=@ClientId 大概ClientId上至少有一个索引,如果是ClientId, Field1 DESC就更好了,如果是ClientId, Field1 DESC INCLUDE (Field2, 3, 4, ...)就更好了
  • GetProducts @ClientId INT=NULL =NULL 究竟在这里实现了什么?

标签: sql-server


【解决方案1】:

如果您还没有这样做,请创建一个复合索引来优化此查询:

CREATE NONCLUSTERED INDEX idx_ProductMaster_ClientId_Field1 
    ON dbo.ProductMaster (ClientId, Field1 DESC);

您描述的症状的可能原因是参数嗅探,其中最佳执行计划取决于提供的值。第一次调用时生成的执行计划被缓存起来,并在后续执行中重复使用。如果原始参数值不典型,则后续查询的性能可能不是最佳的。我希望建议的索引将使该计划变得轻而易举,并带来一致的性能。

如果此索引不能解决问题,请考虑添加查询提示以避免参数嗅探问题。对于不频繁的查询,请尝试添加查询提示OPTION(RECOMPILE),以便不缓存计划。如果经常执行,请指定OPTION (OPTIMIZE FOR (@ClientId UNKNOWN)),以便根据平均统计而不是提供的参数值生成计划。后者将提供一致的性能,但不一定对所有值都是最优的。

【讨论】:

  • 如果经常执行,指定 OPTION (OPTIMIZE FOR (@ClientId UNKNOWN)) 以便根据平均统计而不是提供的参数值生成计划。 I认为这个建议应该多一点限定(多一点限定:考虑指定):我使用过OPTIMIZE FOR UNKNOWN,它不是参数化嗅探的通用解决方案。 brentozar.com/archive/2013/06/… 很好地说明了原因。
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 2015-02-02
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多