初涉SQL Server性能问题(2/4):列出等待资源的会话
2015-06-03 14:30
381 查看
在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数。这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结果。
问题检测的第2步是获取在进行任何资源等待的会话。下面的脚本会帮助我们获得这些信息。这个查询需要预建立一个函数,如果会话是由SQL Server代理启动的话,会显示具体的作业名。
View Code
这里的输出列和第2步完全相同,我会分析total_elapsed_time占用时间较长的会话,酌情考虑是否终止这些会话,并分析下对应的执行SQL语句。大多数情况下(服务器一致运行稳定,突然卡住了),使用上述步骤就可以解决问题。下一篇文章我们会看下阻塞的会话,还有打开未活动事务的会话。
问题检测的第2步是获取在进行任何资源等待的会话。下面的脚本会帮助我们获得这些信息。这个查询需要预建立一个函数,如果会话是由SQL Server代理启动的话,会显示具体的作业名。
/*************************************************************************************** STEP 3: List the session which are currently waiting/running ****************************************************************************************/ SELECT node.parent_node_id AS Node_id, es.HOST_NAME, es.login_name, CASE WHEN es.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN (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))))) )ELSE es.program_name END AS program_name , DB_NAME(er.database_id) AS DatabaseName, er.session_id, wt.blocking_session_id, wt.wait_duration_ms, wt.wait_type, wt.NoThread , er.command, er.status, er.wait_resource, er.open_transaction_count, er.cpu_time, er.total_elapsed_time AS ElapsedTime_ms, er.percent_complete , er.reads,er.writes,er.logical_reads, wlgrp.name AS ResoursePool , SUBSTRING (sqltxt.TEXT,(er.statement_start_offset/2) + 1, ((CASE WHEN er.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), sqltxt.TEXT)) * 2 ELSE er.statement_end_offset END - er.statement_start_offset)/2) + 1) AS [Individual Query], sqltxt.TEXT AS [Batch Query] FROM SYS.DM_EXEC_REQUESTS er INNER JOIN SYS.DM_EXEC_SESSIONS es ON es.session_id= er.session_id INNER JOIN SYS.DM_RESOURCE_GOVERNOR_WORKLOAD_GROUPS wlgrp ON wlgrp.group_id=er.group_id INNER JOIN (SELECT os.parent_node_id ,task_address FROM SYS.DM_OS_SCHEDULERS OS INNER JOIN SYS.DM_OS_WORKERS OSW ON OS.scheduler_address=OSW.scheduler_address WHERE os.status='VISIBLE ONLINE' GROUP BY os.parent_node_id ,task_address ) node ON node.task_address=er.task_address LEFT JOIN (SELECT session_id, SUM(wait_duration_ms) AS wait_duration_ms,wait_type,blocking_session_id,COUNT(*) AS NoThread FROM SYS.DM_OS_WAITING_TASKS GROUP BY session_id, wait_type,blocking_session_id) wt ON wt.session_id=er.session_id CROSS apply SYS.DM_EXEC_SQL_TEXT(er.sql_handle) AS sqltxt WHERE sql_handle IS NOT NULL AND ISNULL(wt.wait_type ,'') NOT IN ('WAITFOR','BROKER_RECEIVE_WAITFOR') ORDER BY er.total_elapsed_time DESC GO
View Code
这里的输出列和第2步完全相同,我会分析total_elapsed_time占用时间较长的会话,酌情考虑是否终止这些会话,并分析下对应的执行SQL语句。大多数情况下(服务器一致运行稳定,突然卡住了),使用上述步骤就可以解决问题。下一篇文章我们会看下阻塞的会话,还有打开未活动事务的会话。
相关文章推荐
- 初涉SQL Server性能问题(1/4):服务器概况
- Mysql事务,并发问题,锁机制
- [C#-SQLite] SQLite一些奇怪的问题
- pl/sql_4_事务
- MySQL数据恢复--binlog
- JDBC数据库常用操作(mysql)
- pl/sql_4_游标(光标)
- 使用sqlldr命令导入资料到Oracle数据库表中的示例说明
- SQL on Hadoop中出现CPU bound的主要原因
- MYSQL Error2003错误解决方案
- SQL时间格式化
- sqlmap的POST注入
- SQLServer2008找出所有包含172.17.224.40字样的存储过程
- mysql存储过程循环语句简单例子
- 基于ORACLE数据库的循环建表及循环创建存储过程的SQL语句实现
- oracle 数据类型详解---日期型
- oracle 数据类型详解---日期型
- oracle 数据类型详解---日期型
- oracle 数据类型详解---日期型
- oracle 数据类型详解---日期型