2009-12-02 47 views
2

我們有一臺作爲數據庫服務器運行的Windows Server 2003(x64)。 該數據庫配備有32GB的RAM數據庫服務器無故100%

通常數據庫內存使用率(任務管理器)在5-10%之間。 然而,有時候數據庫會突然突然增加到100%並且保持在那裏,並且沒有任何代碼或執行的改變。

各種研究,付費或由我,指出一個單一的存儲過程。 當數據庫爲100%時,禁用此過程將使數據庫恢復正常。

現在這聽起來很明顯,但這裏是奇怪的部分。

存儲過程已優化,內存使用量(來自執行計劃)爲0.01,這非常好。通常執行存儲過程會立即返回結果集。我還付了RackSpace Fanatic Support DBA來查看這個,他說他認爲存儲過程沒有問題。

現在額外的奇怪的一點。

  • 運行SP是即時的。
  • 當DB爲100%時,運行SP,在分鐘後繼續執行分鐘。
  • 禁用SP,將數據庫降至5-10%。
  • 雖然SP被啓用,DB是100%,如果我打開一個新的查詢窗口,並運行從SP確切的代碼,但作爲一個查詢,而不是作爲SP,結果瞬間再次回到

所以,雖然乍一看,這聽起來SP是需要優化的,SP中的實際代碼並不是問題。

我很絕望!

+1

可能是參數嗅探,你手動使用的參數與應用程序運行它的參數不一樣,但我認爲你必須實際發佈一些關於存儲過程的代碼/細節。 – Andrew 2009-12-02 10:29:42

+0

安德魯你說得對。 我向SP添加了RECOMPILE,並且一切都運行良好! – 2009-12-02 10:44:24

+0

把它變成一個帖子,所以我可以給你答案 – 2009-12-02 10:45:43

回答

3

執行計劃可以根據輸入參數SP和結果集的大小而改變。

您可以嘗試將WITH RECOMPILE添加到存儲過程,以獲得每次調用的全新執行計劃。它會讓它慢一點,但有時候SQL Server會因爲大部分查詢的執行計劃異常錯誤而停滯不前,並且在這些情況下重新編譯會有所幫助。

+0

謝謝喬納斯,這是安德魯建議的! – 2009-12-02 10:45:08

1

探查:

SQL Server提供了稱爲探查一個偉大的工具,它可以讓您實時查看正在運行在服務器上的查詢。您應該運行分析器並找出實際發生的事情,並使用它來查找罪魁禍首。

查詢有4種度量:內存,CPU,讀取,寫入。佔用大量這些(單獨或組合)並且被高頻調用的SQL語句是優化的最佳候選者。

運行配置文件並捕獲輸出後,您應該能夠識別要優化的項目。然後,您可以運行SQL語句,查看執行計劃並對其執行必要的優化。

(編輯:添加的內容)

這可能是因爲它不是語句本身不是最優的,但有些鎖定/阻塞/死鎖可能會導致此。服務器上可能還有其他東西在運行,它佔用了這個SP所需的資源,並導致CPU的飆升。

閱讀上探查:

http://msdn.microsoft.com/en-us/library/ms187929.aspx

+0

我已經使用RackSpace的DBA優化了所有這四個選項 – 2009-12-02 10:36:31

+0

您是否優化了一個SP或從Profiler中識別的SP? – 2009-12-02 10:47:45

+0

對查詢沒有更多優化。作爲查詢的查詢是立即的,作爲SP的查詢延遲。安德魯關於參數嗅探的建議是正確的。 – 2009-12-02 10:53:57