您好,欢迎访问一九零五行业门户网

5. SQL Server数据库性能监控

对于在线运行的系统,当前数据库性能监控,通常监视以下几点:(1)是否有阻塞(blocking);(2)是否有等待(waiting),阻塞就是锁(lock)等待;(3)是否运行时间过长(lon
对于在线运行的系统,当前数据库性能监控,通常监视以下几点:
(1) 是否有阻塞 (blocking);
(2) 是否有等待 (waiting),阻塞就是锁 (lock) 等待;
(3) 是否运行时间过长(long running);
(4) 是否有死锁 (deadlock);
sys.dm_exec_query_stats之类,等一些统计性的信息,通常不作为实时告警内容,而是在性能优化时,作为参考。
一. 阻塞/等待/长时间运行
1. sql server 2005 及以后版本检查
select r.session_id      ,r.blocking_session_id      ,db_name(r.database_id) as database_name      ,r.start_time      ,r.total_elapsed_time      ,r.[status]      ,case when r.blocking_session_id 0 then'blocking'           when r.blocking_session_id= 0 and r.wait_type is not null then 'waiting'           else 'long-running'       end as slowness_type      ,r.percent_complete      ,r.command      ,r.wait_type      ,r.wait_time      ,r.wait_resource      ,r.last_wait_type      ,r.cpu_time      ,r.reads      ,r.writes      ,r.logical_reads      ,t.[text] as executing_batch      ,substring(t.[text],                r.statement_start_offset/2,                (case whenr.statement_end_offset =-1                       thendatalength(t.[text]) --len(convert(nvarchar(max),t.text)) * 2               else r.statement_end_offset               end - r.statement_start_offset )/2+ 1) as executing_sql      ,bt.[text] as blocking_batch      ,substring(bt.[text],                br.statement_start_offset/2,                (case whenbr.statement_end_offset = -1                       thendatalength(bt.[text]) --len(convert(nvarchar(max),bt.text)) * 2               else br.statement_end_offset               end - br.statement_start_offset )/2+ 1) as blocking_sql     --,p.query_plan  from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text(r.sql_handle) as t cross apply sys.dm_exec_query_plan(r.plan_handle) as p  left join sys.dm_exec_requests br    on r.blocking_session_id =br.session_id outer apply sys.dm_exec_sql_text(br.session_id) as bt where r.session_id > 50 and r.session_id  @@spid   and r.total_elapsed_time >30 * 60 * 1000 order by r.total_elapsed_timedesc;以上脚本返回运行超过30分钟的语句,需要注意的是:
(1) 如果返回执行计划,会让以上脚本变慢很多,可以不返回,在收到告警后检查语句时,再去查看执行计划;
(2) 显示text,比如: xp_cmdshell这样的语句,start_offset, end_offset都为0,截取的 text是空白,只有看text才知道是什么语句;还有就是有时需要知道这个请求来自哪个batch或者存储过程;
(3) 有时显示text还不够,还以xp_cmdshell为例,需要dbcc inputbuffer才能看到完整的sql语句;另外已运行结束但还没有commit/rollback的事务,在requests中已经没有了,也需要借用dbcc inputbuffer来查看sql 语句;
dbcc inputbuffer(@@spid)(4) sql agent作业,在这里会被一并检查,也可以通过msdb..sysjobactivity另行检查;
select b.name, *   from msdb..sysjobactivity a inner join msdb.dbo.sysjobs b    on a.job_id = b.job_id where b.name like '%backup%'
其它类似信息

推荐信息