列出在SQL Server上运行的查询

BIB*_*IBD 193 sql-server

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

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

小智 195

这将显示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
Run Code Online (Sandbox Code Playgroud)

如果您需要从结果中查看针对给定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)
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过删除对master的引用来修改它以与SQL v12 +(即Azure)一起使用。用'dbo.sysprocesses'替换'master.dbo.sysprocesses' (2认同)

Sco*_*vey 90

如果您正在运行SQL Server 2005或2008,则可以使用DMV来查找...

SELECT  *
FROM    sys.dm_exec_requests  
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)  
Run Code Online (Sandbox Code Playgroud)


ich*_*ban 30

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

  • 这并不总是有用的.有时查询似乎会生成子spid,尤其是在使用OPENQUERY或链接服务器时.很难从sp_who中分辨出父查询是什么. (3认同)

小智 17

我建议查询这些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
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得一个TotalPagesAllocated可以帮助您找出spid占用所有服务器资源的方法.很多时候我甚至无法调出活动监视器并使用这些sys视图来查看正在发生的事情.

我建议你阅读以下文章.我从这里得到了这个参考.


Rem*_*anu 16

产品内置了各种管理视图.在SQL 2000上,您将使用sysprocesses.在SQL 2K5上有更多的视图,如sys.dm_exec_connections,sys.dm_exec_sessionssys.dm_exec_requests.

还有像sp_who这样利用这些视图的过程.在2K5 Management Studio中,您还可以获得活动监视器.

最后但并非最不重要的是社区贡献的脚本,如Adam MachanicWho Is Active.

  • SQL 8.0.x又名。SQL 2000 (2认同)

tla*_*lle 11

实际上,EXEC sp_who2在查询分析器/管理工作室中运行提供的信息比sp_who.

除此之外,您可以设置SQL事件探查器来监视服务器的所有输入和输出流量.Profiler还可以让您精确缩小所关注的内容.

对于SQL Server 2008:

START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler
Run Code Online (Sandbox Code Playgroud)

请记住,探查器确实是一个记录和观看应用程序.只要它正在运行,它将继续记录和观察.它可能会填满文本文件或数据库或硬盘驱动器,因此请注意观察它们的时间和长度.


小智 11

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
Run Code Online (Sandbox Code Playgroud)


小智 9

作为注释,可以通过右键单击当前服务器并转到上下文菜单中的"活动监视器"来找到SQL Server 2008的SQL Server活动监视器.我发现如果你使用SQL Server Management Studio,这是杀死进程的最简单方法.


Tyl*_*ler 8

在对象资源管理器中,向下钻取到:服务器 - >管理 - >活动监视器.这将允许您查看当前服务器上的所有连接.

  • 我在 SQL 2008 的“管理”下没有看到任何名为“活动监视器”的内容。 (2认同)

Shi*_*kar 6

试试这个:

它将为您提供所有用户查询。直到spid 50,都是sql server内部进程会话。但是,如果您愿意,可以删除 where 子句:

select
r.session_id,
r.start_time,
s.login_name,
c.client_net_address,
s.host_name,
s.program_name,
st.text
from sys.dm_exec_requests r
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
left join sys.dm_exec_connections c
on r.session_id = c.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st where r.session_id  > 50
Run Code Online (Sandbox Code Playgroud)


Ste*_*man 5

这是一个查询,它将显示所有被阻止的查询。我不完全确定它是否只会显示缓慢的查询:

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 )
Run Code Online (Sandbox Code Playgroud)


but*_*ski 5

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
Run Code Online (Sandbox Code Playgroud)

KILL @spid
Run Code Online (Sandbox Code Playgroud)

  • 这样可以吗..!! 如果我被 spid 杀死。这只会杀死一个查询吗?我的疑问是 spid 和 session_is 对于该会话或服务器中运行的每个查询都是唯一的? (2认同)

Gab*_*rbe 5

正确的脚本如下所示:

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
Run Code Online (Sandbox Code Playgroud)


Anv*_*esh 5

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

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
Run Code Online (Sandbox Code Playgroud)

使用以下脚本,您还可以找到每个数据库的连接数:

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

有关更多详细信息,请访问:http : //www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/