2014-11-05 156 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