2009-08-21 70 views
2

我有一個sproc比我預期的花費更多的時間。sproc執行速度遠低於SQL即席查詢等效

我拿出SQL並用參數的DECLARED變量運行它。它幾乎是瞬間運行(相比於可靠的8秒鐘)。這是同一臺機器上的相同SQL,返回相同的數據。

我怎樣才能找出並解決導致sproc緩慢的原因?

這是在SQL Server Express上。

非常感謝。

+0

聽起來像參數嗅探:http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html – 2009-08-21 04:06:42

回答

1

這是參數嗅探。只需改變你的過程來做同樣的事情:把你所有的參數複製到局部變量中,而不是讓你的過程的主體使用loal變量。

+0

感謝RBarryYoung和rexem!進行這一更改使得存儲過程按預期執行。 – 2009-08-21 05:44:16

0

是運行存儲過程的應用程序,還是通過查詢分析器運行存儲過程?

1

在存儲過程的定義中,檢查ANSI_NULLS。確保已打開。 (SET ANSI_NULLS ON

默認情況下,它在SSMS中的查詢窗口中處於打開狀態。我們發現一個問題,其中ANSI_NULLS被明確設置爲關閉,並大大減緩了存儲空間。

+0

IIRC這來自於sproc想要使用的索引使用不同的設置構建(因此不兼容) – RBarryYoung 2009-08-22 04:59:19

+0

在存儲過程中設置某些選項(包括ANSI_NULLS)可能會導致SP重新編譯 - 這肯定是導致性能問題的原因。有關更多信息,請參閱http://support.microsoft.com/kb/243586 – 2009-08-23 09:35:09