2009-12-01 56 views
1

組, 我仍在學習SQL,並且遇到新問題。我有一對存儲過程在初始執行/連接上很慢。例如,我有一個存儲過程(sp),我在應用程序中使用它來查找產品的價格。我第一次在早上運行sp可能需要20-40秒才能執行。之後,它只需要1-2秒...我們還對sp(s)使用的表執行每日更新,更新後緩存被清除,並且初始運行需要20-40秒,然後是1 -2秒後。初始執行時存儲過程緩慢

有沒有辦法解決這個問題?不確定我是否應該在每日更新中添加某些內容,以便在更新(可能會變得麻煩)時觸發我的sp,或者如果我可以向我的sp添加一些信息,告訴它不清除緩存(這可能會導致空間問題)。我不知道該怎麼做,在初始執行後一切都很好...

任何建議,非常感謝。

+1

你使用了哪個數據庫? – 2009-12-01 21:26:36

回答

2

您看到速度差異的可能原因是由於緩存。一旦你運行了SProc,執行計劃就會進入緩存並且速度更快。我們在我們的環境中所做的就是在上午7:30左右將更多使用的SProcs作爲計劃任務運行,以便他們在開始工作日時早上8點爲我們的用戶「預熱」。

1

這有兩個潛在的原因。

  1. 首先,任何存儲過程首次運行它必須被編譯,這需要時間。編譯後的計劃然後(取決於供應商)緩存,因此後續執行不必重新編譯它。甚至以後,如果它在一段時間內還沒有被執行,高速緩存中的編譯計劃可能會被覆蓋並需要重新編譯。其次,(對於大多數供應商而言),當您運行任何查詢時,讀取執行查詢所需的數據頁面。但查詢處理器從緩存中「讀取」它們。只有當數據頁面不在緩存中時,處理器纔會轉到磁盤。因此,它第一次需要數據存儲時間,它通常會爲數據創建磁盤,但後續需要這些數據頁的執行將從內存緩存中獲取它們。由於磁盤I/O的速度比RAM I/O慢幾個數量級,這可能會導致查詢執行時間出現非常顯着的差異。