具有高 tempdb 使用率和低 RAM 使用率的 SQL Server 2016
我有一個小型 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
在這些執行時間較長的基準查詢的情況下,這種寫入行為是否正常?如果沒有,我可以從哪裡開始故障排除?回應評論:
- 在伺服器屬性 > 記憶體中將最大記憶體設置為 14336 GB
- 帶有 tcph 查詢的相關hammerdb 程式碼:https ://pastebin.com/AwJ000Qp
- 範例計劃文件(上面的查詢 #18): https ://www.brentozar.com/pastetheplan/?id=B1CkC9kE4
我的理解是 tempdb 僅在伺服器處於記憶體壓力時使用
這並不完全正確。有很多事情會導致 tempdb 使用:
- 最明顯的是將數據顯式寫入本地或全域臨時表(
#tempTableName
或##tempTableName
)。我想這不是你的問題- 版本儲存活動(例如,由於使用快照隔離或 RCSI 的查詢)
- 有一些執行計劃運算符可以“溢出”到 tempdb
您的問題很可能是溢出。有關一些良好的一般資訊和特定故障排除步驟的連結,請查看 Paul White 對問題的答案,即散列/排序溢出到 tempdb 中的頻率是多少?
如果某些最有問題的查詢仍在您的計劃記憶體中,您還可以執行
sp_BlitzCache @SortOrder = 'spills'
(從First Responder Kit中)查找它們。至於處理溢出,您可以發布有關錯誤查詢的單獨問題,並且可能會在解決導致溢出的任何問題(錯誤的基數估計、小記憶體授予等)方面獲得幫助。
記憶體壓力會導致低記憶體授予,這會導致 tempdb 溢出——這就是為什麼我說你最初關於記憶體壓力的斷言並不完全正確——因為有時它是正確的!
您提供的執行計劃是一個估計的執行計劃,因此它不指示是否有任何運算符溢出到 tempdb。但它確實有多個消耗記憶體的運算符(特別是排序),因此它有可能生成 tempdb 活動。