是否有一种方法列出当前在MS SQL Server上运行的查询(无论是通过企业管理器还是SQL)和/或谁连接?
我想我有一个很长时间运行的查询正在我的一个数据库服务器上执行,我想跟踪它并停止它(或不断启动它的人)。
是否有一种方法列出当前在MS SQL Server上运行的查询(无论是通过企业管理器还是SQL)和/或谁连接?
我想我有一个很长时间运行的查询正在我的一个数据库服务器上执行,我想跟踪它并停止它(或不断启动它的人)。
当前回答
如果你正在运行SQL Server 2005或2008,你可以使用DMV's找到这个…
SELECT *
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
更多关于sys.dm_exec_requests的信息 更多关于sys.dm_exec_sql_text的信息
其他回答
这将显示在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 sys.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)
实际上,在Query Analyzer / Management Studio中运行EXEC sp_who2比sp_who提供更多的信息。
除此之外,您还可以设置SQL Profiler来监视到服务器的所有进出流量。Profiler还可以让您缩小您正在观看的内容。
SQL Server 2008:
START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler
请记住,分析器实际上是一个记录和监视应用程序。只要它在运行,它就会继续记录和监视。它可能会填满文本文件、数据库或硬盘驱动器,所以要小心你让它看什么,看多长时间。
您可以运行sp_who命令来获取当前所有用户、会话和进程的列表。然后你可以对任何阻挡其他蜘蛛运行KILL命令。
下面是一个查询,它将显示任何阻塞的查询。我不完全确定它是否只会显示缓慢的查询:
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 )
建议查询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。很多时候,我甚至无法打开活动监视器并使用这些系统视图来查看发生了什么。
我建议你读下面这篇文章。我从这里得到了这个参考。