2009-06-02 62 views
154

是否有辦法列出當前在MS SQL Server上運行的查詢(通過企業管理器或SQL)和/或誰已連接?列出在SQL Server上運行的查詢

我想我已經有一個很長的運行查詢正在我的一個數據庫服務器上執行,我想跟蹤它並停止它(或繼續啓動它的人)。

+1

我使用SQL Sever 8.0.x – BIBD 2009-06-02 20:44:12

回答

157

這將顯示一個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 

如果您需要查看SQL運行從結果一個給定的SPID,使用這樣的:

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

您可以運行sp_who命令以獲取所有當前用戶,會話和進程的列表。然後,您可以在阻止其他人的spid上運行KILL命令。

+2

這並不總是有幫助。有時候查詢似乎會產生子spid,特別是在使用OPENQUERY或連接的服務器時。從sp_who中很難判斷父查詢是什麼。 – Nathan 2010-12-22 03:04:08

0

使用Sql Server Profiler(工具菜單)監視正在執行的查詢並使用Management Studio中的活動監視器查看連接方式以及連接是否阻塞了其他連接。

3

在2005年,你可以右鍵單擊一個數據庫,去報告,並有對過渡和鎖等報告整個列表...

3

這裏是一個查詢,將顯示被阻止任何疑問。我不能完全肯定這是否只是顯示慢查詢:

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

其實,在查詢分析器/ Management Studio中運行EXEC sp_who2給出比sp_who更多信息。

除此之外,您可以設置SQL事件探查器來查看服務器的所有進出流量。 Profiler還可讓您精確縮小您正在觀看的內容。

對於SQL Server 2008:

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

記住分析器是一個真正的日誌記錄和觀看的應用程序。只要它正在運行,它將繼續記錄和觀察。它可能會填滿文本文件或數據庫或硬盤驅動器,因此請小心您所看到的內容和時間。

+0

SQL Server Profiler是每個人都應該開始的地方! – Shane 2017-04-19 15:50:45

74

如果您正在運行SQL Server 2005或2008年,您可以使用DMV的找到這個......

SELECT * 
FROM sys.dm_exec_requests 
     CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
+0

如果當前數據庫兼容級別低於90,則此查詢在SQL Server 2005下不起作用。如果當前數據庫兼容性較低,請切換到主數據庫以運行此查詢。 – 2017-11-10 08:38:02

7

在對象資源管理器中,深入到:服務器 - >管理 - >活動監視器。這將允許您查看當前服務器上的所有連接。

+0

我在SQL 2008上看不到任何名爲Activity Monitor的活動監視器。 – jpierson 2013-08-07 19:38:44

14

我建議查詢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視圖來查看發生了什麼。

我建議你閱讀下面的文章。 I got this reference from here

+0

我們還使用Quest數據庫性能分析,爲服務器上正在進行的操作提供了非常好的可視化圖像。其中一件壞事是它告訴誰是受害者,但很難弄清誰在消耗資源。這雖然有幫助。 – dhi 2012-06-18 23:39:19

1
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 
+1

這將是好的.. !!如果我殺死spid。會殺死只有一個查詢?我的疑問是spid,並且session_is對於在該會話或服務器中運行的每個查詢都是唯一的? – buttowski 2012-10-24 12:51:42

+0

t從哪裏來?此查詢對我來說有語法錯誤。 – jpierson 2013-08-07 19:40:59

+0

我認爲這個查詢是即時編寫的,所以我編輯它;)。 – 2015-06-07 10:58:36

10
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 
4

合適的劇本會是這樣的:

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 
3

您可以使用下面的查詢來查找運行最後一個請求:

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 

使用下面的腳本,你還可以找到每個數據庫連接數:

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/

3

作爲一個說明,在SQL Server活動監視器的SQL Server 2008可以發現通過右鍵單擊當前服務器並轉到上下文菜單中的「活動監視器」。如果您使用SQL Server Management Studio,我發現這是殺死進程的最簡單方法。

+0

這應該是一個評論,但是,是的,它是如此有用,它獲得更多的知名度作爲答案:-)它現在幫助我。謝謝 – Loudenvier 2018-02-28 14:52:27