加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 如何找出是谁/什么是锤击SQL Server TempDB

发布时间:2021-01-12 11:16:13 所属栏目:MsSql教程 来源:网络整理
导读:我正在使用SQL Server 2012 Enterprise.服务器配置了一个可用性组. 实例上有不同工具的几个数据库.这些工具都属于一起,因此推出了.在推出后,我认识到TempDB的perfmon计数器Transaction / sec有所上升.在推出之前,计数器的平均值是30,现在大约是300. 在过去

我正在使用SQL Server 2012 Enterprise.服务器配置了一个可用性组.
实例上有不同工具的几个数据库.这些工具都属于一起,因此推出了.在推出后,我认识到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!)

结合这两个应该给你一个好主意.

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读