初涉SQL Server性能问题(3/4):列出阻塞的会话

原文:初涉SQL Server性能问题(3/4):列出阻塞的会话

初涉SQL Server性能问题(2/4)里,我们讨论了列出等待资源或正运行的会话脚本。这篇文章我们会看看如何列出包含具体信息的话阻塞会话清单。

 1 /******************************************************************************************/
 2 CREATE FUNCTION [dbo].dba_GetStatementForSpid
 3 (
 4    @spid SMALLINT
 5 )
 6 RETURNS NVARCHAR(4000)
 7 BEGIN
 8    DECLARE @SqlHandle BINARY(20)
 9    DECLARE @SqlText NVARCHAR(4000)
10    SELECT @SqlHandle = sql_handle
11       FROM sys.sysprocesses WITH (nolock) WHERE   spid = @spid
12    SELECT @SqlText = [text] FROM
13       sys.dm_exec_sql_text(@SqlHandle)
14    RETURN @SqlText
15 END
16 GO
17
18 /*****************************************************************************************
19 STEP 4: List the current blocking session information
20 ****************************************************************************************/
21
22 SELECT
23 es.session_id,
24 es.HOST_NAME,
25 DB_NAME(database_id) AS DatabaseName,
26 CASE WHEN es.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN (SELECT 'SQL AGENT JOB: '+name FROM msdb..sysjobs WHERE job_id=MASTER.DBO.ConvertStringToBinary (LTRIM(RTRIM((SUBSTRING(es.program_name,CHARINDEX('(job',es.program_name,0)+4,35))))))
27 ELSE es.program_name END  AS program_name ,
28 es.login_name ,
29 bes.session_id AS Blocking_session_id,
30 MASTER.DBO.dba_GetStatementForSpid(es.session_id) AS [Statement],
31 bes.HOST_NAME AS Blocking_hostname,
32 CASE WHEN Bes.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN
33 (SELECT 'SQL AGENT JOB: '+name FROM msdb..sysjobs WHERE job_id=
34 MASTER.DBO.ConvertStringToBinary
35 (LTRIM(RTRIM((SUBSTRING(Bes.program_name,CHARINDEX('(job',es.program_name,0)+4,35))))))
36 ELSE Bes.program_name END  AS Blocking_program_name,
37 bes.login_name AS Blocking_login_name,
38   MASTER.DBO.dba_GetStatementForSpid(bes.session_id ) AS [Blocking Statement]
39 FROM sys.dm_exec_requests S
40 INNER JOIN sys.dm_exec_sessions  es ON es.session_id=s.session_id
41 INNER JOIN sys.dm_exec_sessions  bes ON bes.session_id=s.blocking_session_id

这个脚本会列出被阻塞和正阻塞的语句信息,帮助我们进行问题分析。下面的脚本会帮助我们列出已经打开事务但未活动的会话,即打开事务,但上30秒内都没执行任何语句的会话。

 1 /*****************************************************************************************
 2 STEP 4: List the Open session with transaction which is not active
 3 ****************************************************************************************/
 4 SELECT es.session_id,
 5 es.login_name,
 6 es.HOST_NAME,
 7 DB_NAME(SP.dbid) AS DatabaseName,
 8 sp.lastwaittype,
 9 est.TEXT,cn.last_read,
10 cn.last_write,
11 CASE WHEN es.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN(SELECT 'SQL AGENT JOB: '+name FROM msdb..sysjobs WHERE job_id=MASTER.DBO.ConvertStringToBinary (LTRIM(RTRIM((SUBSTRING(es.program_name,CHARINDEX('(job',es.program_name,0)+4,35)))))
12 )ELSE es.program_name END  AS program_name
13 FROM sys.dm_exec_sessions es
14 INNER JOIN sys.dm_tran_session_transactions st ON es.session_id = st.session_id                INNER JOIN sys.dm_exec_connections cn ON es.session_id = cn.session_id
15 INNER JOIN sys.sysprocesses SP ON SP.spid=es.session_id
16 LEFT OUTER JOIN sys.dm_exec_requests er  ON st.session_id = er.session_id
17 AND er.session_id IS NULL
18 CROSS APPLY sys.dm_exec_sql_text(cn.most_recent_sql_handle) est
19 WHERE (DATEDIFF(SS,cn.last_read,GETDATE())+DATEDIFF(SS,cn.last_write,GETDATE()))>30
20 AND lastwaittype NOT IN ('BROKER_RECEIVE_WAITFOR' ,'WAITFOR')
21 GO 

 

时间: 2024-09-11 10:01:00

初涉SQL Server性能问题(3/4):列出阻塞的会话的相关文章

初涉SQL Server性能问题(4/4):列出最耗资源的会话

原文:初涉SQL Server性能问题(4/4):列出最耗资源的会话 在上3篇文章里,我们讨论了列出反映服务器当前状态的不同查询. 初涉SQL Server性能问题(1/4):服务器概况 初涉SQL Server性能问题(2/4):列出等待资源的会话 初涉SQL Server性能问题(3/4):列出阻塞的会话 这篇文章我们看下从计划缓存里列出执行状态. 1 /*********************************************************************

初涉SQL Server性能问题(2/4):列出等待资源的会话

原文:初涉SQL Server性能问题(2/4):列出等待资源的会话 在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数.这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结果. 问题检测的第2步是获取在进行任何资源等待的会话.下面的脚本会帮助我们获得这些信息.这个查询需要预建立一个函数,如果会话是由SQL Server代理启动的话,会显示具体的作业名. 1 /********************

初涉SQL Server性能问题(1/4):服务器概况

原文:初涉SQL Server性能问题(1/4):服务器概况 当你作为DBA时,很多人会向你抱怨:"这个程序数据加载和蜗牛一样,你看看是不是服务器出问题了?"造成这个问题的原因有很多.可能是程序应用服务器问题,网络问题,程序实现方式问题,数据库服务器负荷过重.不管是哪个问题,数据库总是第一个被抱怨的.我们DBA的职责就是找出问题所在,并解决它们. 问题解决第一步,诊断分析: 1 SELECT 2 parent_node_id AS Node_Id, 3 COUNT(*) AS [No.

怎么整理 SQL Server性能调整清单

我需要做什么?太多了,我从哪里开始?我下一步该做什么?哇,我的SQL Server起来了!如果你从一开始就不知道要到哪里去,并且异常中断了SQL Server的运行,那么你做到了.看看这篇如何获得高性能SQL Server的性能调整清单吧. SQL Server性能调整清单 准备 当你开始解决一个现有的性能调整问题或者从一个新的系统开始,非常期望得到高性能,那么花些时间在计划和分析如何达到项目目标吧.确保整个团队都理解了SQL Server现在正在做什么,它将会作什么,以及它以后应该如何做. 有

SQL Server 性能优化之——系统化方法提高性能

原文http://www.cnblogs.com/BoyceYang/archive/2013/06/15/3138142.html 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结   1. 概述 在比较大的范围内找出能够大幅提高性能的区域,并且专注于分析这个区域,这是最有效的优化SQL Server性能的方式.否则,大量的时间和精力可能被浪费在不能提高很大性能的区域.在这里并没有讨论关于多用户并发所带来的性

SQL Server性能的改进得益于逻辑数据库设计

索引设计和查询设计方面.反过来说,最大的性能问题常常是由其中这些相同方面中的不足引起的.其实SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生.其实SQL的性能优化是一个复杂的过程,以上这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置.网络层的流量控制以及操作系统层的总体设计. SQL语句优化的原则: ◆1.使用索引来更快地遍历表 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在

清单:负载测试——SQL Server性能调整的魔法棒

没有什么事情比这更糟了,采纳一个新的应用程序,而它的性能是如此的糟糕,导致业务在一片惊叫声中暂停.这并不是新出现的现象:这就是事实,我经常遇到这样的事实.我打赌你也曾经经历过.那么如何防止这些性能问题,有什么解决方案? 在这些应用程序"在惊叫声中暂停"的情况中,应用程序通常都已经在按照功能性分配的短暂的测试时间内进行过适当的测试了.但是充分吗?由于竞争和全球经济的原因,迅速应用于业务意味着只进行了最小化的测试.同样,最小化的测试也成为按时将应用程序发布给用户群体的可接受的风险之一.另一

如何优化Windows OS使SQL Server性能最优化

1.问题提出   这些天菜鸟又遇到麻烦事儿了.Server Team交给菜鸟的这批服务器跑起SQL Server来老是不顺畅.菜鸟情不至尽的想起了老鸟,于是,敲开了老鸟办公室的门:   "鸟哥,到底我们要如何定制化或者说如何优化我们的Windows Server OS来使得我们的SQL Server达到最大程度的性能优化呢?".老鸟还没有反应过来,菜鸟劈头盖脸的问道.   老鸟顿了两秒,自信的回答道:"菜鸟,有进步啊,开始学会思考问题了.我们可以按照如下方法来优化我们的操作系

MSSQL · 实现分析 · Extend Event实现审计日志对SQL Server性能影响

背景 在上一篇月报分享中,我们介绍了SQL Server实现审计日志功能的四种方法,最终的结论是使用Extend Event(中文叫扩展事件)实现审计日志方法是最优选择,详情参见MSSQL · 实现分析 · SQL Server实现审计日志的方案探索.那么,使用Extend Event实现审计日志的方案会面对如下疑问: Extend Event是否满足可靠性要求 Extend Event是否满足吞吐量要求 Extend Event对SQL Server本身语句查询性能影响到底有多大 这篇文章就是