2014-11-05 94 views
0

我有一个表包含100列和2,000,000条记录。当我使用存储过程获取记录时,有时会收到“等待操作超时”。 error.When我改变存储过程,然后尝试获取记录它会正常工作。等待操作在SQL Server中超时

任何人都可以让我知道什么是最好的解决方案吗?

SP如下

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 
+0

是的。按照常见问题解答这个问题。 “帮助我”没有任何信息是不好的。 – TomTom 2014-11-05 11:58:55

+0

嗨TomTom,我编辑了问题,并给出了我在哪些问题。 – rjpithawa 2014-11-05 12:22:40

+0

您是否有ProductMaster上的任何索引?可能有助于发布您的架构。 – Bridge 2014-11-05 12:25:23

回答

1

创建一个综合指数,以优化这个查询,如果你还没有这样做:

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

为你描述的症状可能的原因是参数嗅探,其中最佳执行计划根据提供的值而变化。第一次调用时生成的执行计划被缓存并重新用于后续执行。如果原始参数值不典型,性能可能不适合后面的查询。我希望这个指数能够让这个计划变得不那么简单,并且会带来一致的表现。

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

+0

*如果它经常执行,请指定OPTION(OPTIMIZE FOR(@ClientId UNKNOWN)),以便根据平均统计数据而不是提供的参数值生成计划。*我认为这个建议应该有一定的限制资格:*考虑指定*):我已经使用了'OPTIMIZE FOR UNKNOWN',它不是参数化嗅探的一般化解决方案。 http://www.brentozar.com/archive/2013/06/optimize-for-unknown-sql-server-parameter-sniffing/演示了为什么相当好。 – 2014-11-06 01:02:35

+0

+1,但是 – 2014-11-06 01:03:42