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 ''
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)

转自:http://blog.csdn.net/yangzhawen/article/details/7241200

获得客户端详细信息以及每个进程的sql语句的更多相关文章

  1. 如何进行SCCM中客户端记录信息维护

    SCCM 部署完毕之后,不久我们就会发现客户端代理状态,因为重装系统,非正常的退域,长时间不开机,导致客户端状态有不可用的,有过期的,重复的记录很多.当然我们可以手动的快速删除重复的记录,那么怎么能做 ...

  2. oracle从客户端到sql语句追踪

    这两天看小布老师的视频学习了一下从客户端到oracle数据库发送执行的SQL语句的跟踪,整理一下笔记. 需要用到的命令:netstat oracle端要用到的四个视图为: V$session:当前有多 ...

  3. Linux 查找指定名称的进程并显示进程详细信息

    实际应用中可能有这样的场景:给定一个进程名称特征串,查找所有匹配该进程名称的进程的详细信息. 解决的办法是: (1) 先用pgrep [str] 命令进行模糊匹配,找到匹配该特征串的进程ID: (2) ...

  4. linux下查看运行进程详细信息

    通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等.这时,我们需要通过以下的方法来查看进程的详细信息: Linux在启动一个进程时,系统会在/proc下创建一个 ...

  5. [ArgumentException: 可能证书“CN=JRNet01-PC”没有能够进行密钥交换的私钥,或者进程可能没有访问私钥的权限。有关详细信息,请参见内部异常。]

    堆栈跟踪: [CryptographicException: 密钥集不存在. ] System.Security.Cryptography.Utils.CreateProvHandle(CspPara ...

  6. 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?

    1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...

  7. 在Visual Studio中调试时,如何检查有关进程令牌的详细信息?

    从Visual Studio 2005开始,watch窗口获得了一个伪寄存器,用于调查有关进程令牌的详细信息.所以,你只要开始调试,在监视窗口中写下“$user”, 有时查看特权和组的扩展视图会很有趣 ...

  8. PHP获取当前服务器详细信息

    最近正在用PHP写一个企业级的CMS,后台需要用到PHP获取当前服务器的详细信息以及相关系统参数信息,整理了整理,现在贴这儿,以备后用. 获取系统类型及版本号:    php_uname() (例:W ...

  9. 【好文推荐】黑莓OS手册是如何详细阐述底层的进程和线程模型的?

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

随机推荐

  1. [BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划

        描述 Description     某天,小x在玩一个经典小游戏——zumo.zumo游戏的规则是,给你一段长度为n的连续的彩色珠子,珠子的颜色不一定完全相同,但是,如果连续相同颜色的珠子大 ...

  2. Laravel输出JSON时设定输出字段的几种情况总结

    1.如果输出json的时候需要屏蔽某些字段,或则想自定义显示的字段: 1.model里面设置 protected $hidden = ['password'];//要屏蔽的字段 2.model里面设置 ...

  3. bzoj 1012 BST 支持插入,区间最大

    水... /************************************************************** Problem: 1012 User: idy002 Lang ...

  4. iOS Core Animation 动画 入门学习(一)基础

    reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide ...

  5. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 1 Edition) C. Little Artem and Random Variable 数学

    C. Little Artem and Random Variable 题目连接: http://www.codeforces.com/contest/668/problem/C Descriptio ...

  6. leetcode76. Minimum Window Substring

    leetcode76. Minimum Window Substring 题意: 给定字符串S和字符串T,找到S中的最小窗口,其中将包含复杂度O(n)中T中的所有字符. 例如, S ="AD ...

  7. 东东糖博客MYSQL

    http://blog.chinaunix.net/uid-20785090-id-4328033.html

  8. 学习mfc书籍

    Visual C++ and MFC Programming http://www.math.hcmuns.edu.vn/~tatuana/C%20For%20Win/MFC/Tai%20Lieu%2 ...

  9. 树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)

    题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...

  10. .NET:为什么不能在子类或外部发布C#事件

    背景 一个朋友问了一个问题:“为什么不能在子类或外部发布C#事件?”,我说我不知道,要看看生产的IL代码,下面我们看看. 测试 代码 using System; using System.Collec ...