Sql-Server

SQL Server 2016 All Queries 一直在重新編譯(計劃記憶體損壞?)

  • October 15, 2018

我有一個 SQL Server 2016 SP1 生產伺服器。它已經執行了 330 天而沒有重新啟動。一切都執行良好。直到上週的一天,突然之間,伺服器上的每個查詢都在生成一個編譯。

通常當我檢查 Perfmon 時,我會看到很多 Batch Requests/Sec,但今天,我看到的 Requests/Sec 與 Compilations/Sec 一樣多

這裡有幾個監控

當我試圖查看什麼在使用我的記憶體時,我什麼都沒有!我從來沒有見過這樣的事情。它持續了一整天,因為它一直在編譯,所以 CPU 一直處於 100% 狀態。

最後,IT 決定重啟機器。重啟後一切都修復了。但我想知道,你見過這樣的事情嗎?記憶體計劃會損壞嗎?(就像如果我執行了一個 DBCC FREEPROCCACHE 一樣,它會在不重新啟動的情況下自行修復?)

這是否意味著我應該至少每六個月左右重新啟動一次伺服器?

這是同一台伺服器的正常基線。 這是一個正常基線

您應該啟用記憶體中的鎖定頁面(LPIM)。

在 SQL Server 2016+ 上,我遇到了類似的情況,我認為這是一個錯誤。當伺服器遇到記憶體壓力並且啟用 LPIM 時,SQL Server 將清除計劃記憶體作為其將記憶體釋放回作業系統的過程的一部分。這很正常。SQL Server 僅應在記憶體不足的情況下執行此操作。

在某些情況下,SQL Server 將繼續清除計劃記憶體,即使在解決了記憶體不足的情況之後也是如此。這會導致您看到的行為。在繁忙的伺服器上,您會看到一些計劃進入計劃記憶體,但幾秒鐘後就會被清除。這不是正確的行為。

啟用 LPIM 將解決該問題。啟用 LPIM 是所有 SQL Server 安裝的最佳實踐,因此我建議為每個 SQL Server 實例啟用此功能,無論版本如何或您是否遇到此問題。

啟用記憶體中的鎖定頁面選項

  1. 在開始菜單上,點擊執行。在打開框中,鍵入 gpedit.msc。
  2. 在本地組策略編輯器控制台上,展開電腦配置,然後展開 Windows 設置。
  3. 展開安全設置,然後展開本地策略。
  4. 選擇使用者權限分配文件夾。
  5. 策略將顯示在詳細資訊窗格中。
  6. 在窗格中,點兩下鎖定記憶體中的頁面。
  7. 在本地安全設置 - 在記憶體中鎖定頁面對話框中,點擊添加使用者或組。
  8. 在“選擇使用者、服務帳戶或組”對話框中,選擇 SQL Server 服務帳戶。
  9. 重新啟動 SQL Server 服務以使此設置生效。

引用自:https://dba.stackexchange.com/questions/201729