Sql-Server

如何解決 tempdb 上的阻塞問題

  • February 22, 2016

我在其中一台伺服器(SQL Server 2008 R2)上存在 tempdb 爭用(我猜,至少)。

攔截器和服務員(其中 10 個)在數據庫 tempdb 上都有 PAGELATCH_EX 等待類型,並且所有會話(攔截器和服務員)的 waitresource 都是“2:1:122”。

我檢查了 SQL 程式碼,發現在大多數會話中都創建了表變數,我懷疑這可能是罪魁禍首。

任何有關如何進一步診斷和緩解此問題的建議表示讚賞。

PAGELATCH_XX - 這表示 SQL 正在等待訪問數據庫頁面,但該頁面沒有進行物理 IO。此類問題是由大量 spid 試圖同時訪問同一個物理頁引起的。wait_resource 是正在訪問的頁碼(格式為 dbid:file:pageno)。如果在實時伺服器上進行診斷,性能儀表板報告將執行 DBCC PAGE 並顯示輸出以告訴您爭用的頁面對象和類型(分配、數據、文本……)

由於 SQL 最常等待的頁面位於 tempdb 數據庫中(dbid 中的頁碼為 2),因此您可能面臨 tempdb 分配鎖存器爭用。

Tempdb 分配頁面鎖存器爭用可能發生在每秒數百或數千次創建和銷毀臨時對象(包括用於排序或散列操作的工作表/工作文件)的工作負載中。

解決 -

1.實現跟踪標誌-T1118。

2.增加 tempdb 中的數據文件數量,以最大限度地提高磁碟頻寬並減少分配結構中的爭用。作為一般規則,如果邏輯處理器的數量小於或等於 8,則使用與邏輯處理器相同數量的數據文件。如果邏輯處理器的數量大於 8,則使用 8 個數據文件,然後如果爭用繼續,則將數據文件的數量增加 4 的倍數(直到邏輯處理器的數量),直到爭用減少到可接受的水平或使更改工作負載/程式碼。

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