列出在SQL Server上运行的查询

有没有办法列出当前在MS SQL Server上运行的查询(通过企业pipe理器或SQL)和/或谁连接?

我想我有一个长时间运行的查询正在我的一个数据库服务器上执行,我想跟踪它并停止它(或继续启动它的人)。

这将显示SQL 2000或SQL 2005服务器上运行时间最长的SPID:

select P.spid , right(convert(varchar, dateadd(ms, datediff(ms, P.last_batch, getdate()), '1900-01-01'), 121), 12) as 'batch_duration' , P.program_name , P.hostname , P.loginame from master.dbo.sysprocesses P where P.spid > 50 and P.status not in ('background', 'sleeping') and P.cmd not in ('AWAITING COMMAND' ,'MIRROR HANDLER' ,'LAZY WRITER' ,'CHECKPOINT SLEEP' ,'RA MANAGER') order by batch_duration desc 

如果您需要查看运行结果中给定spid的SQL,请使用如下所示的内容:

 declare @spid int , @stmt_start int , @stmt_end int , @sql_handle binary(20) set @spid = XXX -- Fill this in select top 1 @sql_handle = sql_handle , @stmt_start = case stmt_start when 0 then 0 else stmt_start / 2 end , @stmt_end = case stmt_end when -1 then -1 else stmt_end / 2 end from master.dbo.sysprocesses where spid = @spid order by ecid SELECT SUBSTRING( text, COALESCE(NULLIF(@stmt_start, 0), 1), CASE @stmt_end WHEN -1 THEN DATALENGTH(text) ELSE (@stmt_end - @stmt_start) END ) FROM ::fn_get_sql(@sql_handle) 

如果您正在运行SQL Server 2005或2008,您可以使用DMVfind这…

 SELECT * FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
  • 更多关于sys.dm_exec_requests的信息
  • 更多关于sys.dm_exec_sql_text的信息

您可以运行sp_who命令来获取所有当前用户,会话和进程的列表。 然后,您可以在任何阻止其他人的spid上运行KILL命令。

产品中内置了各种pipe理视图。 在SQL 2000上你会使用sysprocesses 。 在SQL 2K5上还有更多的视图,如sys.dm_exec_connections , sys.dm_exec_sessions和sys.dm_exec_requests 。

还有像sp_who这样的程序来利用这些视图。 在2K5 pipe理工作室,您还可以获得活动监视器。

最后但并非最不重要的还有社区贡献的脚本,如Adam Machanic的“ 谁是活跃” 。

我会build议查询sys视图。 类似的东西

 SELECT * FROM sys.dm_exec_sessions s LEFT JOIN sys.dm_exec_connections c ON s.session_id = c.session_id LEFT JOIN sys.dm_db_task_space_usage tsu ON tsu.session_id = s.session_id LEFT JOIN sys.dm_os_tasks t ON t.session_id = tsu.session_id AND t.request_id = tsu.request_id LEFT JOIN sys.dm_exec_requests r ON r.session_id = tsu.session_id AND r.request_id = tsu.request_id OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) TSQL 

这样你就可以得到一个TotalPagesAllocated ,它可以帮助你找出正在占用所有服务器资源的spid 。 有很多时候,我什至不能提出活动监视器,并使用这些sys视图来看看发生了什么事情。

我会build议你阅读下面的文章。 我从这里得到了这个参考 。

实际上,在查询分析器/pipe理工作室中运行EXEC sp_who2会得到比sp_who更多的信息。

除此之外,您可以设置SQL事件探查器来监视所有进出服务器的stream量。 Profiler还可以让您精确地缩小您正在观看的内容。

对于SQL Server 2008:

 START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler 

请记住,探查器是一个真正的日志logging和观看应用程序。 只要它正在运行,它将继续logging和观察。 它可能会填满文本文件或数据库或硬盘驱动器,所以要小心你所看到的和多久。

 SELECT p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, r.command, p.program_name, text FROM sys.dm_exec_requests AS r, master.dbo.sysprocesses AS p CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) WHERE p.status NOT IN ('sleeping', 'background') AND r.session_id = p.spid 

在对象资源pipe理器中,深入到:服务器 – >pipe理 – >活动监视器。 这将允许您查看到当前服务器的所有连接。

正确的脚本将是这样的:

 select p.spid, p.status,p.hostname,p.loginame,p.cpu,r.start_time, t.text from sys.dm_exec_requests as r, sys.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) t where p.status not in ('sleeping', 'background') and r.session_id=p.spid 

在2005年,你可以右键点击一个数据库,去报告,有一个关于过渡和锁等报告的整个列表…

这是一个查询,将显示任何阻塞的查询。 我不完全确定它是否会显示缓慢的查询:

 SELECT p.spid ,convert(char(12), d.name) db_name , program_name , convert(char(12), l.name) login_name , convert(char(12), hostname) hostname , cmd , p.status , p.blocked , login_time , last_batch , p.spid FROM master..sysprocesses p JOIN master..sysdatabases d ON p.dbid = d.dbid JOIN master..syslogins l ON p.sid = l.sid WHERE p.blocked = 0 AND EXISTS ( SELECT 1 FROM master..sysprocesses p2 WHERE p2.blocked = p.spid ) 

您可以使用以下查询来查找运行的最后一个请求:

 SELECT der.session_id ,est.TEXT AS QueryText ,der.status ,der.blocking_session_id ,der.cpu_time ,der.total_elapsed_time FROM sys.dm_exec_requests AS der CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS est 

使用下面的脚本,你也可以find每个数据库的连接数量:

 SELECT DB_NAME(DBID) AS DataBaseName ,COUNT(DBID) AS NumberOfConnections ,LogiName FROM sys.sysprocesses WHERE DBID > 0 GROUP BY DBID, LogiName 

欲了解更多详情,请访问: http : //www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/

 SELECT p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, t.text FROM sys.dm_exec_requests as r, master.dbo.sysprocesses as p CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) t WHERE p.status NOT IN ('sleeping', 'background') AND r.session_id = p.spid 

 KILL @spid 

需要注意的是,SQL Server 2008的SQL Server活动监视器可以通过右键单击当前的服务器并转到上下文菜单中的“活动监视器”来find。 如果您使用的是SQL Server Management Studio,我发现这是杀死进程的最简单的方法。

使用Sql Server Profiler(工具菜单)监视正在执行的查询并使用Management Studio中的活动监视器来查看连接方式以及连接是否阻塞了其他连接。

你应该尝试非常有用的程序sp_whoIsActive可以在这里find: http : sp_whoIsActive它是免费的。