我正在使用sql Server 2012 Enterprise.服务器配置了一个可用性组.
实例上有不同工具的几个数据库.这些工具都属于一起,因此推出了.在推出后,我认识到TempDB的perfmon计数器Transaction / sec有所上升.在推出之前,计数器的平均值是30,现在大约是300.
在过去,我已经遇到了类似的问题,并发现一个工具的新版本实现了一直被调用的游标.但这次这似乎不是问题.我使用sql分析器跟踪游标事件但没有找到任何有趣的东西.我还尝试使用tempDB本身的过滤器进行跟踪,但看起来没有任何进展.
实例上有不同工具的几个数据库.这些工具都属于一起,因此推出了.在推出后,我认识到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
(Thanks Dave!)
结合这两个应该给你一个好主意.