sp_block查看数据库进程状态(是否阻塞,执行SQL等),可替代sp_who

来源:互联网 发布:java 注解开发 编辑:程序博客网 时间:2024/05/22 14:04

 

   写这个存储过程的初衷就是当有业务部门反映系统慢时,能快速知道数据库是否有阻塞,blocking其他进程的SQL是什么。后来又有一个需求想实现:在停止数据库服务之前,能快速知道数据库当前运行着什么SQL,以决定是否可以立即停止数据库,还是需要等某些SQL运行完。


   写完这个存储过程,几经更改,在使用过程中,发现这个存储过程确实非常方便和好用,故分享给大家,希望对大家有用,也欢迎大家多提建议。

 

总结下这个存储过程的用途:


 1,查看数据库是否有阻塞;哪些进程在阻塞和被阻塞;阻塞了多少个进程和阻塞了多长时间?阻塞的SQL是什么?这个SQL当时的执行计划是什么?
 2,查看进程的常规信息,例如什么帐户登录,使用了哪个数据库,客户端名称和ip地址?
 3,查看进程运行状态,等待类型,等待资源,消耗的cpu,read,write等。
 4,通过查询全局临时表,可以统计当前服务器有多少个login在运行,多少个客户端在连接等。
 5,作为自动杀阻塞进程的sp的调用子sp。(这个后续推出)

 

 一些注释说明:


 1,为防止执行时间过长,仅显示blocking进程的执行计划。如果使用SQL Server2008的ssms,可以直接点击查询结果中的数据查看到图形化的执行计划;
 2,系统进程被阻塞,也会显示;(这个未经过充分验证)
 3,session_status 有时不匹配request_status,原因:存在脏读;或读取时间不一致
 4,当前自己进程的信息不显示(即执行这个sp的窗口),除非这个进程阻塞了其他进程;
 5,不论@status输入参数如何,blocking和blocked总是显示,可以用此特性只显示blocking和blocked

 

 结果集的一些说明:


 1,blocking_spid: 阻塞其他进程的进程号,如果某个进程正在阻塞其他进程,这个列显示为:kill spid,否则会显示被阻塞的层次关系;
 2,blocked_count: 本进程阻塞其他进程的个数;
 3,blocked_time: 本进程阻塞其他进程的最长时间;

 

 

 

 下面是调用的函数:

原创粉丝点击