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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数。这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结果。

问题检测的第2步是获取在进行任何资源等待的会话。下面的脚本会帮助我们获得这些信息。这个查询需要预建立一个函数,如果会话是由SQL Server代理启动的话,会显示具体的作业名。

复制代码
 1 /*****************************************************************************************
 2            PREREQUISITE FUNCTION
 3 ******************************************************************************************/
 4 USE MASTER
 5 GO 
 6 CREATE FUNCTION ConvertStringToBinary  ( @hexstring  VARCHAR(100)
 7 )  RETURNS BINARY(34)  AS
 8 BEGIN
 9 
10    RETURN(SELECT CAST('' AS XML).value('xs:hexBinary( substring(sql:variable("@hexstring"), sql:column("t.pos")) )', 'varbinary(max)')
11    FROM (SELECT CASE SUBSTRING(@hexstring, 1, 2) WHEN '0x' THEN 3 ELSE 0 END) AS t(pos))  
12 END
13 /***************************************************************************************
14 STEP 2: List the session which are currently waiting for resource
15 ****************************************************************************************/
16 SELECT node.parent_node_id AS Node_id,
17 es.HOST_NAME,
18 es.Login_name,
19 CASE WHEN es.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN
20          (
21           SELECT 'SQL AGENT JOB: '+name FROM msdb..sysjobs WHERE job_id=
22           MASTER.DBO.ConvertStringToBinary (LTRIM(RTRIM((SUBSTRING(es.program_name,CHARINDEX('(job',es.program_name,0)+4,35)))))
23           )
24     ELSE es.program_name END  AS [Program Name] ,
25 DB_NAME(er.database_id) AS DatabaseName,
26 er.session_id, 
27 wt.blocking_session_id,
28 wt.wait_duration_ms,
29 wt.wait_type,
30 wt.NoThread ,
31 er.command,
32 er.status,
33 er.wait_resource,
34 er.open_transaction_count,
35 er.cpu_time,
36 er.total_elapsed_time AS ElapsedTime_ms,
37 er.percent_complete ,
38 er.reads,
39 er.writes,
40 er.logical_reads,
41 wlgrp.name AS ResoursePool              ,
42 SUBSTRING   (sqltxt.TEXT,(er.statement_start_offset/2) + 1,          
43             ((CASE WHEN er.statement_end_offset = -1          
44              THEN LEN(CONVERT(NVARCHAR(MAX), sqltxt.TEXT)) * 2          
45              ELSE er.statement_end_offset          
46             END - er.statement_start_offset)/2) + 1) AS [Individual Query], 
47 sqltxt.TEXT AS [Batch Query]                
48 FROM (SELECT session_id, SUM(wait_duration_ms) AS 
49 wait_duration_ms,wait_type,blocking_session_id,COUNT(*) AS NoThread 
50 FROM  SYS.DM_OS_WAITING_TASKS  GROUP BY session_id, wait_type,blocking_session_id) wt 
51 INNER JOIN SYS.DM_EXEC_REQUESTS  er ON wt.session_id=er.session_id INNER JOIN SYS.DM_EXEC_SESSIONS es ON es.session_id= er.session_id
52 INNER JOIN SYS.DM_RESOURCE_GOVERNOR_WORKLOAD_GROUPS wlgrp ON wlgrp.group_id=er.group_id          
53 INNER JOIN  (SELECT  os.parent_node_id ,task_address FROM SYS.DM_OS_SCHEDULERS  OS INNER JOIN 
54 SYS.DM_OS_WORKERS  OSW ON OS.scheduler_address=OSW.scheduler_address 
55 WHERE os.status='VISIBLE ONLINE' GROUP BY os.parent_node_id ,task_address ) node   
56 ON node.task_address=er.task_address
57 CROSS APPLY SYS.DM_EXEC_SQL_TEXT(er.sql_handle) AS sqltxt
58 WHERE sql_handle IS NOT NULL AND wt.wait_type NOT IN ('WAITFOR','BROKER_RECEIVE_WAITFOR')
59 GO
复制代码

输出结果的每列说明介绍如下:

  • Node_id  NUMA节点ID。可以被调度者查询的节点映射。
  • HOST_NAME 建立连接的计算机名。
  • Login_name 连接到数据库服务器的会话用户名。
  • Program Name 使用会话的对应程序名。在连接字符串里可以设置程序名。如果会话是SQL Server代理的一部分,则显示作业名。
  • DatabaseName 会话的当前数据库名。
  • session_id 会话ID。
  • blocking_session_id 阻塞语句的会话ID。
  • wait_duration_ms 等待时间,单位为毫秒。这个时间不包括信号等待时间(signal wait time )。
  • wait_type 等待类型名称,例如:SLEEP_TASK,CXPACKET等。
  • NoThread 当前会话的线程数,如果当前会话是并行执行(parallel execution)的话。
  • command 标识当前类型的命令,即T-SQL语句,例如Select,insert,update,delete等。
  • status 请求状态:Background,Running,Runnable,Sleeping 和 Suspended。
  • wait_resource 请求当前等待的资源。
  • open_transaction_count 当前会话打开的事务数。
  • cpu_time 请求使用的CPU时间,单位毫秒。
  • ElapsedTime_ms 自请求到达后,占用的CPU时间,单位毫秒。
  • percent_complete 指定操作的工作完成进度,例如备份、还原、回滚等。
  • reads 请求执行的读数。
  • writes 请求执行的写数。
  • logical_reads 请求执行的逻辑读数。
  • ResoursePool 资源管理池名称。
  • Individual Query 在会话里运行的批处理SQL语句。
  • Batch Query 在会话里运行的批处理(存储过程/一系列的语句)。

上述查询多次执行后,输出结果有很长wait_duration_ms的会话,这个会话不被其他会话阻塞,且一直在输出结果里。我们就要看看这个会话的程序名,主机名,登录用户名,还有对应的执行语句,具体进行什么操作造成的。根据这些信息,我们可以选择性的去终止这个会话,然后分析下具体的执行语句。如果会话是被阻塞的,我们要用另外的语句来找出阻塞的会话。

第3步,列出服务器上正运行的会话清单。

复制代码
 1 /***************************************************************************************
 2 STEP 3: List the session which are currently waiting/running
 3 ****************************************************************************************/
 4 SELECT node.parent_node_id AS Node_id,
 5 es.HOST_NAME,
 6 es.login_name,
 7 CASE WHEN es.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN
 8 (SELECT 'SQL AGENT JOB: '+name FROM msdb..sysjobs WHERE job_id=DBO.ConvertStringToBinary (LTRIM(RTRIM((SUBSTRING(es.program_name,CHARINDEX('(job',es.program_name,0)+4,35)))))
 9 )ELSE es.program_name END  AS program_name ,
10 DB_NAME(er.database_id) AS DatabaseName,
11 er.session_id, 
12 wt.blocking_session_id,
13 wt.wait_duration_ms,
14 wt.wait_type,
15 wt.NoThread ,
16 er.command,
17 er.status,
18 er.wait_resource,
19 er.open_transaction_count,
20 er.cpu_time,
21 er.total_elapsed_time AS ElapsedTime_ms,
22 er.percent_complete ,
23 er.reads,er.writes,er.logical_reads,
24 wlgrp.name AS ResoursePool              ,
25 SUBSTRING (sqltxt.TEXT,(er.statement_start_offset/2) + 1,                
26 ((CASE WHEN er.statement_end_offset = -1                
27 THEN LEN(CONVERT(NVARCHAR(MAX), sqltxt.TEXT)) * 2                
28 ELSE er.statement_end_offset                
29 END - er.statement_start_offset)/2) + 1) AS [Individual Query],
30 sqltxt.TEXT AS [Batch Query]                
31 FROM 
32 SYS.DM_EXEC_REQUESTS  er INNER JOIN SYS.DM_EXEC_SESSIONS es ON es.session_id= er.session_id
33 INNER JOIN SYS.DM_RESOURCE_GOVERNOR_WORKLOAD_GROUPS wlgrp ON wlgrp.group_id=er.group_id          
34 INNER JOIN  (SELECT  os.parent_node_id ,task_address FROM SYS.DM_OS_SCHEDULERS  OS 
35 INNER JOIN SYS.DM_OS_WORKERS  OSW ON OS.scheduler_address=OSW.scheduler_address
36 WHERE os.status='VISIBLE ONLINE' GROUP BY os.parent_node_id ,task_address ) node ON node.task_address=er.task_address
37 LEFT JOIN 
38 (SELECT session_id, SUM(wait_duration_ms) AS 
39 wait_duration_ms,wait_type,blocking_session_id,COUNT(*) AS NoThread 
40 FROM  SYS.DM_OS_WAITING_TASKS  GROUP BY session_id, wait_type,blocking_session_id) wt 
41 ON wt.session_id=er.session_id
42 CROSS apply SYS.DM_EXEC_SQL_TEXT(er.sql_handle) AS sqltxt
43 WHERE sql_handle IS NOT NULL AND ISNULL(wt.wait_type ,'') NOT IN 
44 ('WAITFOR','BROKER_RECEIVE_WAITFOR')
45 ORDER BY er.total_elapsed_time DESC
46 
47 GO 
复制代码

这里的输出列和第2步完全相同,我会分析total_elapsed_time占用时间较长的会话,酌情考虑是否终止这些会话,并分析下对应的执行SQL语句。大多数情况下(服务器一致运行稳定,突然卡住了),使用上述步骤就可以解决问题。



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4543544.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
9天前
|
SQL 数据处理 数据库
专坑同事的SQL写法:性能杀手揭秘
【8月更文挑战第29天】在日常的数据库开发与维护工作中,编写高效、清晰的SQL语句是每位数据工程师的必修课。然而,不当的SQL编写习惯不仅能降低查询效率,还可能给同事的工作带来不必要的困扰。今天,我们就来揭秘八种常见的“专坑同事”SQL写法,助你避免成为那个无意间拖慢整个团队步伐的人。
21 1
|
14天前
|
SQL 关系型数据库 MySQL
【MySQL 慢查询秘籍】慢SQL无处遁形!实战指南:一步步教你揪出数据库性能杀手!
【8月更文挑战第24天】本文以教程形式深入探讨了MySQL慢SQL查询的分析与优化方法。首先介绍了如何配置MySQL以记录执行时间过长的SQL语句。接着,利用内置工具`mysqlslowlog`及第三方工具`pt-query-digest`对慢查询日志进行了详细分析。通过一个具体示例展示了可能导致性能瓶颈的查询,并提出了相应的优化策略,包括添加索引、缩小查询范围、使用`EXPLAIN`分析执行计划等。掌握这些技巧对于提升MySQL数据库性能具有重要意义。
46 1
|
23天前
|
SQL 监控 数据库
SQL Server如何判断哪些会话/连接是长连接?
【8月更文挑战第14天】在SQL Server中,判断长连接可通过活动监视器查看持续时间和状态;查询`sys.dm_exec_sessions`获取持续时间超阈值的会话;利用性能监视器跟踪“User Connections”计数器变化;审查应用代码中连接池配置;或分析网络流量寻找持久连接。这些方法有助于管理和优化连接。
|
7天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
19 0
|
7天前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
24 0
|
2月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
52 13
|
2月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
2月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
43 6
|
14天前
|
SQL NoSQL 关系型数据库
性能与扩展性的考量:SQL vs NoSQL
【8月更文第24天】在选择数据库系统时,开发者和架构师面临着一个关键决策:是选择传统的SQL(结构化查询语言)数据库还是现代的NoSQL(非关系型)数据库。这两种类型各有优劣,尤其是在性能和扩展性方面。本文将深入探讨SQL和NoSQL数据库在这两个方面的差异,并通过具体的代码示例来展示它们各自的优势。
26 0
|
2月前
|
JSON 数据格式 SQL
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决
下一篇
DDNS