2010-04-14 51 views
1

我看不出執行計劃有什麼問題。此外,據我所知,SQL Server 2000通過識別與現有執行計劃的T-SQL語句相關的新T-SQL語句,將存儲過程的許多性能優勢擴展到所有SQL語句中(通過保留對所有SQL語句的執行計劃過程高速緩存,而不僅僅是存儲過程執行計劃)爲什麼在不使用存儲過程時SQL可以更快地在SQL Server 2000上執行?

這是一個相當直接的SELECT語句,具有敏感的表連接,沒有包含事務或在查詢中引用鏈接的服務器,並且應用了WITH(NOLOCK)表提示。存儲過程由dbo創建,用戶具有所有必需的權限。

所以我的問題是這樣的:

什麼是可能的原因時,相同的T-SQL通過存儲過程運行查詢來只需要幾秒鐘就可以運行,但隨後需要幾分鐘?

回答

2

能想到的兩個可能的原因:

  • 存儲過程可能會使用過時的執行計劃。如果您刪除並重新創建存儲過程,則其執行計劃將被重新編譯。
  • 存儲過程針對一般情況進行了優化。如果您執行具有特定值的查詢,SQL Server可能會爲這些值找到更好的執行計劃。如果是這種情況,將OPTION (OPTIMIZE FOR UNKNOWN)添加到非過程版本應該會使其變慢。
+0

這發生在特定服務器上的特定數據庫上,併爲相當多的存儲過程這樣做。丟棄/重新創建沒有效果。使用參數化值運行查詢ala NHibernate通常工作得更好(對於我運行的測試),所以這看起來與任何特定值都沒有關係。這是製作和「工作」,但這是我想揭穿的東西。 – 2010-04-14 23:02:55

相關問題