之前文章(SQLServer 利用profiler生成脚本在后台跟踪堵塞语句或慢查询语句) 有用 profiler 可以慢查询或堵塞查询,但是profiler 开销太大,又需要指定时长。现在用个简单sql定时查询统计。
最底部执行的脚本,会查询当前正在被堵塞和堵塞其他会话的会话。
use [master]
go
create database Demo
go
alter database Demo set recovery simple with no_wait
go
use Demo
go
-- 创建表结构
-- drop table dbo.blockedSession
select GETDATE() as addTime,spid,blocked,waittime,lastwaittype,waitresource,open_tran,status
,p.dbid,cpu,physical_io,memusage,login_time,last_batch,hostname,[program_name]
,hostprocess,cmd,nt_domain,nt_username,net_address,net_library,loginame,sql_handle,text
into dbo.blockedSession
from master.dbo.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) s where 1<>1
go
alter table dbo.blockedSession add constraint DF_blockedSession_addTime default(getdate()) for addTime
go
--创建定时任务执行,如10秒执行一次.
insert into Demo.dbo.blockedSession(spid,blocked,waittime,lastwaittype,waitresource,open_tran,status
,p.dbid,cpu,physical_io,memusage,login_time,last_batch,hostname,[program_name]
,hostprocess,cmd,nt_domain,nt_username,net_address,net_library,loginame,sql_handle,text)
select spid,blocked,waittime,lastwaittype,waitresource,open_tran,status
,p.dbid,cpu,physical_io,memusage,login_time,last_batch,hostname,[program_name]
,hostprocess,cmd,nt_domain,nt_username,net_address,net_library,loginame,sql_handle,text
from master.dbo.sysprocesses p with(nolock) cross apply sys.dm_exec_sql_text(p.sql_handle) s
where blocked >0 or spid in(select sp.blocked from master.dbo.sysprocesses sp with(nolock) where sp.blocked>0)
go