2013-02-09 59 views
5

在我的SQL Server 2008標準版安裝上跟蹤性能監視器,我注意到SQL彙編/秒的峯值每五秒鐘左右,3〜50左右如何確定什麼是SQL Server的編譯

我們也有相對較高的編譯率與批量請求/秒。我理解這應該是1/10的比例,但我們的工作更像8/10。

db支持一個擁有大量應用程序的繁忙網站,所以很難確定是什麼導致了過多的編譯,尤其是5秒的高峯。幾乎所有的查詢都是存儲過程調用而不是嵌入式SQL,而且我們有大量(48GB)RAM。

有沒有辦法在特定的時間查看當前正在編譯的查詢?如果是這樣,我們可以確定是否有問題。

回答

6

當我必須查看計劃緩存/過度查詢重新編譯問題時,我遵循了Microsoft白皮書‘Plan Caching in SQL Server 2008’中提供的指導,我強烈建議您閱讀它,因爲它涵蓋了計劃緩存,查詢計劃重用,重新編譯原因,識別重新編譯和其他相關主題。因此,SQL Server Profiler(如果您將它安裝爲客戶端工具安裝的一部分,應位於Microsoft SQL Server 2008下的「性能工具」下)公開與查詢編譯直接相關的三個事件,這些事件可能有所幫助你:

  • 光標
    • CursorRecompile
  • 性能
    • 顯示計劃XML查詢編譯
  • 存儲過程
    • SP:重新編譯

您在使用存儲過程,從而有可能你只需要擔心SP:Recompile事件。只要重新編譯存儲過程,觸發器或用戶定義函數,此事件就會觸發。 TextData列將顯示導致語句重新編譯的tsql語句的文本,而EventSubClass列將顯示指示重新編譯原因的代碼。

爲SP EventSubClass代碼:重新編譯在SQL 2008

  • 1 =架構改變
  • 2 =統計更改
  • 3 =重新編譯DNR
  • 4 =設定選件已變更
  • 5 =溫度表更改
  • 6 =遠程行集更改
  • 7 =對於瀏覽燙髮改變
  • 更改了8個
  • 9 = MPI查看=查詢通知環境的變化
  • 10 =遊標選項更改
  • 11 =帶重新編譯選項

如果您監視以下5個事件可以查看哪些存儲過程和語句正在SQL Server上調用,哪些正在觸發重新編譯:

  • 存儲過程的
    • SP:啓動
    • SP:StmtStarting
    • SP:重新編譯
    • SP:已完成
  • 性能
    • 自動統計

我通常還會設置Profiler跟蹤來捕獲這些事件的所有列。我會說,用這5個事件設置一個跟蹤,運行30到60秒的跟蹤,然後暫停它,然後你應該有什麼導致重新編譯的快照。

如果噪聲太多,您可以開始將列過濾器添加到跟蹤屬性以過濾輸入/輸出事件。例如,如果您發現大多數重新編譯僅發生在一次數據庫上,請在databaseID或databaseName列上設置列篩選器,以便在跟蹤中包含針對該數據庫運行的查詢。

然後開始尋找重新編譯查詢的模式,並使用Microsoft的白皮書作爲指導,說明爲什麼它們可能會觸發重新編譯。

+0

非常有幫助,謝謝你,格倫。 – 2013-02-10 21:23:21