0

我有一個需要調用SQL Server 2008數據庫每次調用最多需要15分鐘的存儲過程。長時間運行的存儲過程對性能的影響

它會對訪問相同數據庫/數據庫服務器的其他系統造成性能影響嗎?如果是這樣,我如何才能最大限度地降低性能影響

更新:存儲過程比較審計歷史記錄,它需要根據記錄的類型調用另一個存儲過程,因此它必須逐行進行。我可以將遊標更改爲while循環,但可能會有超過300萬行要處理(取決於過濾條件)。

+0

光標或while循環都是緩慢的,他們可能是你爲什麼SP是如此緩慢的原因。嘗試用CTE替換它並加入 – 2013-04-12 05:22:35

回答

0

當proc處於活動狀態時,查看服務器上的CPU活動。如果您知道如何使用PerfMon,則可以查看一些SQL Server計數器。

我想說15分鐘的查詢可能是優化的候選人。確保你有所有必要的索引並避免使用遊標。

+0

感謝您的快速回復!存儲過程必須對每一行執行某些操作,所以我在存儲過程中使用了光標 - 您是否重新檢查我應該從.net打開一個數據讀取器連接,然後處理.net代碼中的每一行? – developer 2013-04-05 15:28:26

+1

@Mait是的!什麼!光標是你可以爲你的性能做的最糟糕的事情之一,因爲它們佔用大量內存,使用光標的15分鐘過程在執行期間肯定會影響整體服務器的性能。幸運的是,有很多好方法來替換遊標。最好的選擇是將您的查詢轉換爲基於集合的操作。這裏有一個很好的鏈接來解釋這樣做的各種方式 - http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – 2013-04-05 15:39:58

+0

@Mait最後,如果你沒有找到一種方法來設置基於操作和確實需要逐行進行,但仍然有更好的選項,然後使用cursor - SQL while循環或.NET。 – 2013-04-05 15:40:46

0

選項1.按原樣運行,但這很可能會導致性能問題。

選項2.如果可能,重做查詢以提高性能。當然,它不能花費15分鐘,除非你的SQL寫得很糟糕,或者你只是在處理大量的數據。 也許發佈SQL?

選項3.正如你所說,你可以在.NET中完成這項工作。

2

我通常可以通過使用帶有需要處理的ID列表的連接來避免使用遊標。您的遊標查詢通常可用作WITH子句或內部連接來選擇要執行處理的語句中要處理的行。

但是請先檢查索引。這是查詢速度慢的最有害的原因。至少where子句中的每個列和連接中的所有ON列都應該編入索引。

0

我們對我們的服務器也有類似的問題。我的經驗是SQL Server是相當資源密集的應用程序,如果你有這樣一個sp,它將對服務器的性能產生巨大的影響。

這裏有一些事情你可以檢查,以提高SP的性能,或使用更少的資源:

1,運行查詢分析器來檢查,如果你丟失的索引,如果有添加。

2,如果使用臨時表,儘量不要使用它。 Tempdb被SQL服務器用於每個數據庫,如果您在sp中運用它時,它會在運行時阻止其他使用臨時表的查詢。或者,您可以使用cte。 3,重做你想做的更小,也許你可以把它分解成幾個可以並行運行的較小的一個。

4,這是一個有線的。如果將參數傳遞給sp,在sp中,將這些參數分配給局部變量,並在sp中使用這些變量,而不是參數。 SQL服務器使用局部變量生成更好的執行計劃。你會看到巨大的速度提升。你不會相信它。

如果你可以張貼SP,我很樂意幫助你做出更快

相關問題