Sql-Server
如何找出誰/什麼在敲擊 SQL Server TempDB
我正在使用 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
(謝謝戴夫!)
結合這兩個應該會給你一個好主意。