ITPub博客

首页 > 数据库 > 数据库开发技术 > 自己改编的用来抓堵塞好用的SQL脚本(转)

自己改编的用来抓堵塞好用的SQL脚本(转)

原创 数据库开发技术 作者:wghao 时间:2007-03-02 08:53:24 0 删除 编辑
因为所处的工作原因,经常会处理SQL运行慢的情况,需要抓出那条捣乱的虫子以表示自己的清白,所以很无奈的看了网上N多的资料,然后try了N+N遍,加上客户的试用,哈,一个比较完整的抓阻塞的脚本就出炉了。[@more@]

来源:http://post.blog.hexun.com/edaily/trackback.aspx?articleid=5211943

0001 SET NOCOUNT ON
0002 declare @sid integer,
0003         @objid integer,
0004         @old_sid integer,
0005         @dbid integer,
0006         @db_name varchar(255)
0007 begin
0008     -- 纪录时间点
0009     select  '====> 时间:' ,
0010             10000 * datepart(yy, getdate()) + 100 * datepart(mm, getdate()) + datepart(dd, getdate()),
0011             10000 * datepart(hh, getdate()) + 100 * datepart(mi, getdate()) + datepart(ss, getdate())
0012 
0013     -- 简单列举当前线程的锁的情况: blocked>0 就是索住了
0014     select '====> 进程情况:====================================='
0015     select
0016         spid as 进程号,
0017         case when blocked >0 then '被'+convert(varchar,blocked)+'进程堵塞'
0018             else '无堵塞' end as 'info',*
0019     from sysprocesses
0020     order by blocked,spid
0021 
0022     -- 为了随后的游标操作不影响sql本身,所以先保存锁信息到临时表,再作分析
0023     select * into #temp from master..syslockinfo order by req_spid
0024     select '====>后台锁情况简单列表====================================='
0025     select * from #temp  order by req_spid
0026 
0027     -- 对每个进程做具体的锁分析,列举设计的表和正在处理的脚本
0028     select req_spid,rsc_dbid,rsc_objid into #temp1 from #temp group by  req_spid,rsc_dbid,rsc_objid
0029      select @old_sid = 0
0030     declare sid_cur CURSOR for
0031         select req_spid,rsc_dbid,rsc_objid from #temp1 order by req_spid,rsc_objid
0032     open sid_cur
0033     if @@error != 0
0034     begin
0035         close sid_cur
0036         deallocate sid_cur
0037         select error_no   = 1,error_info = '打开游标错误[1]'
0038         drop table #temp
0039         drop table #temp1
0040     end
0041     else
0042     begin
0043       fetch sid_cur into @sid,  @dbid,    @objid
0044       while @@fetch_status = 0
0045       begin
0046         if @old_sid <> @sid
0047         begin
0048             select '====>进程'+convert(varchar,@sid)+'锁情况 ============'
0049             exec sp_lock @sid
0050             select '====>进程'+convert(varchar,@sid)+'涉及的脚本或者过程:============= '
0051             dbcc inputbuffer(@sid)
0052         end
0053         select @db_name = 'select ''====>进程'+convert(varchar,@sid)+' 涉及表 ''+ name from '+
0054             db_name(@dbid) +'..sysobjects where type =''U''  '
0055                             +' and id  = ' + convert(varchar,@objid)
0056         exec ( @db_name )
0057         select @old_sid = @sid
0058         fetch sid_cur into @sid,  @dbid,    @objid
0059       end
0060       drop table #temp
0061       drop table #temp1
0062       close sid_cur
0063       deallocate sid_cur
0064     end
0065 end
0066 SET NOCOUNT off

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7764484/viewspace-901202/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-19

  • 博文量
    57
  • 访问量
    243546