获得客户端详细信息以及每个进程的sql语句
来源:互联网 发布:matlab 矩阵转列向量 编辑:程序博客网 时间:2024/06/08 08:21
db性能下降时很多朋友都想监控到是哪个客户端、哪个用户、哪台客户端发起的什么会话sql语句,
但是微软自带的要使用profiler才能实现,但是考虑性能问题,很多人不愿意!
网上有很多脚本能监控到客户端信息,但是唯独不能获取客户端进程的sql语句!
我自己写了一个,供参考:
--1.新建存储过程
--create proc prtest
--@spid int
--as
--dbcc inputbuffer (@spid)
--go
--2.将结果保存到临时变量#tmp
SELECT [Session ID] AS 会话ID ,
[Login] AS 用户名 ,
[Database] AS 数据库 ,
[Task State] AS 状态 ,
[Command] AS 命令 ,
[Application] AS 应用软件 ,
[Wait Time (ms)] AS 等待时间 ,
[Wait Type] AS 等待类型 ,
[Host Name] AS 客户机名 ,
[Net Address] AS IP地址 INTO #tmp
FROM ( SELECT [Session ID] = s.session_id ,
[User Process] = CONVERT(CHAR(1), s.is_user_process) ,
[Login] = s.login_name ,
[Database] = ISNULL(DB_NAME(p.dbid), N'') ,
[Task State] = ISNULL(t.task_state, N'') ,
[Command] = ISNULL(r.command, N'') ,
[Application] = ISNULL(s.program_name, N'') ,
[Wait Time (ms)] = ISNULL(w.wait_duration_ms, 0) ,
[Wait Type] = ISNULL(w.wait_type, N'') ,
[Wait Resource] = ISNULL(w.resource_description, N'') ,
[Blocked By] = ISNULL(CONVERT (VARCHAR, w.blocking_session_id),
'') ,
[Head Blocker] = CASE
WHEN r2.session_id IS NOT NULL
AND ( r.blocking_session_id = 0
OR r.session_id IS NULL
) THEN '1'
ELSE ''
END ,
[Total CPU (ms)] = s.cpu_time ,
[Total Physical I/O (MB)] = ( s.reads + s.writes ) * 8
/ 1024 ,
[Memory Use (KB)] = s.memory_usage * 8192 / 1024 ,
[Open Transactions] = ISNULL(r.open_transaction_count, 0) ,
[Login Time] = s.login_time ,
[Last Request Start Time] = s.last_request_start_time ,
[Host Name] = ISNULL(s.host_name, N'') ,
[Net Address] = ISNULL(c.client_net_address, N'') ,
[Execution Context ID] = ISNULL(t.exec_context_id, 0) ,
[Request ID] = ISNULL(r.request_id, 0) ,
[Workload Group] = ISNULL(g.name, N'')
FROM sys.dm_exec_sessions s
LEFT OUTER JOIN sys.dm_exec_connections c ON ( s.session_id = c.session_id )
LEFT OUTER JOIN sys.dm_exec_requests r ON ( s.session_id = r.session_id )
LEFT OUTER JOIN sys.dm_os_tasks t ON ( r.session_id = t.session_id
AND r.request_id = t.request_id
)
LEFT OUTER JOIN (
SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC ) AS row_num
FROM sys.dm_os_waiting_tasks
) w ON ( t.task_address = w.waiting_task_address )
AND w.row_num = 1
LEFT OUTER JOIN sys.dm_exec_requests r2 ON ( s.session_id = r2.blocking_session_id )
LEFT OUTER JOIN sys.dm_resource_governor_workload_groups g ON ( g.group_id = s.group_id )
LEFT OUTER JOIN sys.sysprocesses p ON ( s.session_id = p.spid )
) t
WHERE t.Command IN ( 'SELECT', 'UPDATE', 'DELETE' )
--3.创建保存结果的临时表
CREATE TABLE #jttest(
[会话ID] [smallint] NOT NULL,
[用户名] [nvarchar](128) NOT NULL,
[数据库] [nvarchar](128) NOT NULL,
[状态] [nvarchar](60) NOT NULL,
[命令] [nvarchar](16) NOT NULL,
[应用软件] [nvarchar](128) NOT NULL,
[等待时间] [bigint] NOT NULL,
[等待类型] [nvarchar](60) NOT NULL,
[客户机名] [nvarchar](128) NOT NULL,
[IP地址] [varchar](48) NOT NULL,
[TSQL] [varchar](4000) NULL
)
--4.将#tmp中值导入到临时表变量#jttest
INSERT INTO #jttest
([会话ID]
,[用户名]
,[数据库]
,[状态]
,[命令]
,[应用软件]
,[等待时间]
,[等待类型]
,[客户机名]
,[IP地址]
)
SELECT
[会话ID]
,[用户名]
,[数据库]
,[状态]
,[命令]
,[应用软件]
,[等待时间]
,[等待类型]
,[客户机名]
,[IP地址]
FROM #tmp
--5.获得每个spid对应的TSQL语句
create table #tmp01(
EventType nvarchar(100),
Parameters Int,
EventInfo nvarchar(max)
)
declare @cursid int
declare cur cursor for select [会话ID] from #jttest
open cur
fetch next from cur into @cursid
while @@FETCH_STATUS=0
begin
insert into #tmp01 exec prtest @cursid
UPDATE #jttest SET TSQL=(SELECT EventInfo FROM #tmp01 )
WHERE 会话ID=@cursid
truncate table #tmp01
fetch next from cur into @cursid
end
close cur
deallocate cur
DROP TABLE #tmp01
--6.查看最终结果
SELECT * FROM #jttest
DROP TABLE #tmp
DROP TABLE #jttest
--dbcc inputbuffer (896)
- 获得客户端详细信息以及每个进程的sql语句
- 获得Sql 数据表的详细信息
- HttpRequest获得服务端和客户端的详细信息
- 取得表结构详细信息的SQL 语句
- 列出C#进程以及详细信息
- 列出C#进程以及详细信息
- 查询sqlserver 正在执行的sql语句的详细信息
- 查询MSSQL数据库中表结构的详细信息的SQL语句
- 查询sqlserver 正在执行的sql语句的详细信息
- 获得联系人的详细信息 代码
- sql语句计算出每个月的天数
- 查看数据库中每个表的详细信息
- 会话的属性以及组建级别和客户端级别的SQL语句跟踪
- 获得hibernate的sql语句(2.1.6)
- 获得所有表信息的SQL语句
- MSSQL中获得SQL语句的执行时间。
- 获得当月天数的Sql语句
- sql语句获得时间的年月日
- Hadoop集群配置(最全面总结)
- ubutu11 下启用root账户和密码
- c#创建自定义控件在winform上添加该控件属性为空白
- Word2007文档怎么样将纸张调成A3格式大小?
- android中的logcat命令
- 获得客户端详细信息以及每个进程的sql语句
- Android上HDMI介绍(基于高通平台)
- 两个shell备份mysql的脚本
- 一致性哈希算法及其在分布式系统中的应用
- LDAP用户验证过程概述
- hadoop INFO ipc.Client: Retrying connect to server: master/192.168.0.45:54310. Already tried 0 time
- 朋友网创意“网络名片”盘点:打造社交圈的个性形象
- 理解计算机3D图形学中的坐标系变换
- Android Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE