Sql-Server

如何找出誰/什麼在敲擊 SQL Server TempDB

  • November 13, 2015

我正在使用 SQL Server 2012 企業版。伺服器配置了一個可用性組。實例上有多個用於不同工具的數據庫。這些工具都屬於一起,因此一起推出。在推出後,我發現 TempDB 的 perfmon 計數器 Transaction / sec 有所上升。在推出之前,計數器平均約為 30,現在約為 300。在過去,我已經遇到過類似的問題,發現一個工具的新版本實現了一個一直被呼叫的游標。但這一次似乎不是問題。我使用 SQL 探查器來跟踪游標事件,但沒有發現任何有趣的東西。我還嘗試在 tempDB 本身上使用過濾器進行跟踪,但看起來那裡沒有發生任何事情。

有誰知道如何找出導致 TempDB 中這些高交易率的原因或原因?

我不確定這是否可能是性能問題,但我想知道為什麼這個數字變化如此之大。

我過去曾使用此腳本來查看哪個 spid 在 tempdb 中有很多頁面:

;WITH s AS
(
   SELECT 
       s.session_id,
       [pages] = SUM(s.user_objects_alloc_page_count 
         + s.internal_objects_alloc_page_count) 
   FROM sys.dm_db_session_space_usage AS s
   GROUP BY s.session_id
   HAVING SUM(s.user_objects_alloc_page_count 
     + s.internal_objects_alloc_page_count) > 0
)
SELECT s.session_id, s.[pages], t.[text], 
 [statement] = COALESCE(NULLIF(
   SUBSTRING(
       t.[text], 
       r.statement_start_offset / 2, 
       CASE WHEN r.statement_end_offset < r.statement_start_offset 
       THEN 0 
       ELSE( r.statement_end_offset - r.statement_start_offset ) / 2 END
     ), ''
   ), t.[text])
FROM s
LEFT OUTER JOIN 
sys.dm_exec_requests AS r
ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.plan_handle) AS t
ORDER BY s.[pages] DESC;

(不記得我從哪裡得到的,抱歉)。這不會給你罪魁禍首(因為他可能一遍又一遍地寫相同的頁面)。

使用此腳本可為您提供大量 IO:

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time

謝謝​​戴夫!)

結合這兩個應該會給你一個好主意。

引用自:https://serverfault.com/questions/735561