天天看点

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

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

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

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步,列出服务器上正运行的会话清单。