Sybase ASE 统计当前执行的SQL语句的存储过程
Sybase ASE自V12.5.0.3引入了MDA表来监控Sybase数据库的性能,ASE15以来MDA的监控能力越来越强。本博客中有关于如何配置MDA表的文章:
MDA中的代理表monProcessSQLText包含当前所有会话正在执行的SQL语句。如果已经配置了MDA,可以通过查询该代理表monProcessSQLText来获得正在执行的SQL语句。
在没有配置MDA监控的环境中,可以使用更加通用的命令来查询当前会话正在执行的SQL语句。dbcc sqltext命令需要sybase_ts_role角色才能执行,过程sp_showplan需要sa_role角色才能执行。
下面提供一个存储过程来查询当前Sybase服务器内正在执行的所有SQL语句。思路是:获得当前使用锁的会话ID(spid),利用游标遍历得到每个spid的正在执行的SQL语句。
use sybsystemprocs go if exists (select 1 from sysobjects where (sysstat & 7) = 4 and name = 'sp_currentsql') begin drop procedure sp_currentsql end go print "Installing sp_currentsql" go --参数:dbid 允许为空,表示查询相应数据库内的SQL语句! create procedure sp_currentsql @dbid int = NULL as declare @retvalue int,@spid int,@spidcount int begin /* ** Must have sa_role to run these commands */ if (proc_role("sa_role") < 1 or proc_role("sybase_ts_role") < 1) begin print "Must have sa_role to execute sp_showplan and sybase_ts_role role to run dbcc sqltext" return(1) end if @@trancount = 0 begin set chained off end set transaction isolation level 1 --set flushmessage on set nocount on create table #tblspid(spid int) if(@dbid is null) begin insert into #tblspid select distinct spid from master.dbo.syslocks where spid > 0 union select distinct spid from master.dbo.syslogshold where spid > 0 end else begin insert into #tblspid select distinct spid from master.dbo.syslocks where spid > 0 and dbid=@dbid union select distinct spid from master.dbo.syslogshold where spid > 0 and dbid=@dbid end delete #tblspid from #tblspid a,master..sysprocesses b where a.spid=b.spid and (b.hostname is null or b.suid=0) select @spidcount=count(*) from #tblspid where spid<>@@spid if(@spidcount>0) begin declare cur_spid cursor for select spid from #tblspid where spid<>@@spid open cur_spid fetch cur_spid into @spid dbcc traceon(3604) while @@sqlstatus=0 begin print "============================%1!===================================================",@spid dbcc sqltext(@spid) print "-----------------------------------------------------------------------------------" --exec sp_showplan @spid,null,null,null fetch cur_spid into @spid end dbcc traceoff(3604) close cur_spid deallocate cursor cur_spid end drop table #tblspid end go exec sp_procxmode 'sp_currentsql', 'anymode' go grant execute on sp_currentsql to public go
下载该存储过程:sp_currentsql.sql