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

简介: 原文:初涉SQL Server性能问题(3/4):列出阻塞的会话在 初涉SQL Server性能问题(2/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 

 

目录
相关文章
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1401 2
|
11月前
|
SQL 关系型数据库 MySQL
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
我是小假 期待与你的下一次相遇 ~
447 0
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
1597 1
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
752 2
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
1114 10
|
SQL IDE 数据库连接
IntelliJ IDEA处理大文件SQL:性能优势解析
在数据库开发和管理工作中,执行大型SQL文件是一个常见的任务。传统的数据库管理工具如Navicat在处理大型SQL文件时可能会遇到性能瓶颈。而IntelliJ IDEA,作为一个强大的集成开发环境,提供了一些高级功能,使其在执行大文件SQL时表现出色。本文将探讨IntelliJ IDEA在处理大文件SQL时的性能优势,并与Navicat进行比较。
451 4
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
1724 3
|
SQL 关系型数据库 MySQL
惊呆:where 1=1 可能严重影响性能,差了10多倍,快去排查你的 sql
老架构师尼恩在读者交流群中分享了关于MySQL中“where 1=1”条件的性能影响及其解决方案。该条件在动态SQL中常用,但可能在无真实条件时导致全表扫描,严重影响性能。尼恩建议通过其他条件或SQL子句命中索引,或使用MyBatis的`<where>`标签来避免性能问题。他还提供了详细的执行计划分析和优化建议,帮助大家在面试中展示深厚的技术功底,赢得面试官的青睐。更多内容可参考《尼恩Java面试宝典PDF》。