Sql-Server

具有高 tempdb 使用率和低 RAM 使用率的 SQL Server 2016

  • January 31, 2019

我有一個小型 SQL Server Standard 實例,我在上面執行 HammerDB TPC-H (1 GB) 基準測試。它有一些配置問題,儘管它將所有內容都寫入tempdb磁碟,而且tempdb由於我的物理儲存速度很慢,這似乎讓我感到瓶頸:

臨時數據庫

數據庫本身大約 3.5 GB,伺服器有 16 GB RAM。

我的理解是,tempdb僅在伺服器處於記憶體壓力下時使用,但它甚至從未達到 30% 的使用率。Physical_memory_in_use_kb永遠不會超過 3 GB,儘管它會隨著時間的推移穩步增長。VMware 主機也沒有任何明顯的問題。

sp_blitz結果警告高 CPU 使用率 (~75-85%),僅此而已。

這是群集中 SQL Server Standard 的幾乎預設安裝 -tempdb在這些執行時間較長的基準查詢的情況下,這種寫入行為是否正常?如果沒有,我可以從哪裡開始故障排除?

回應評論:

我的理解是 tempdb 僅在伺服器處於記憶體壓力時使用

這並不完全正確。有很多事情會導致 tempdb 使用:

  • 最明顯的是將數據顯式寫入本地或全域臨時表(#tempTableName##tempTableName)。我想這不是你的問題
  • 版本儲存活動(例如,由於使用快照隔離或 RCSI 的查詢)
  • 有一些執行計劃運算符可以“溢出”到 tempdb

您的問題很可能是溢出。有關一些良好的一般資訊和特定故障排除步驟的連結,請查看 Paul White 對問題的答案,即散列/排序溢出到 tempdb 中的頻率是多少?

如果某些最有問題的查詢仍在您的計劃記憶體中,您還可以執行sp_BlitzCache @SortOrder = 'spills'(從First Responder Kit中)查找它們。

至於處理溢出,您可以發布有關錯誤查詢的單獨問題,並且可能會在解決導致溢出的任何問題(錯誤的基數估計、小記憶體授予等)方面獲得幫助。

記憶體壓力會導致低記憶體授予,這會導致 tempdb 溢出——這就是為什麼我說你最初關於記憶體壓力的斷言並不完全正確——因為有時它是正確的!


您提供的執行計劃是一個估計的執行計劃,因此它不指示是否有任何運算符溢出到 tempdb。但它確實有多個消耗記憶體的運算符(特別是排序),因此它有可能生成 tempdb 活動。

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