是否有辦法列出當前在MS SQL Server上運行的查詢(通過企業管理器或SQL)和/或誰已連接?列出在SQL Server上運行的查詢
我想我已經有一個很長的運行查詢正在我的一個數據庫服務器上執行,我想跟蹤它並停止它(或繼續啓動它的人)。
是否有辦法列出當前在MS SQL Server上運行的查詢(通過企業管理器或SQL)和/或誰已連接?列出在SQL Server上運行的查詢
我想我已經有一個很長的運行查詢正在我的一個數據庫服務器上執行,我想跟蹤它並停止它(或繼續啓動它的人)。
這將顯示一個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)
使用Sql Server Profiler(工具菜單)監視正在執行的查詢並使用Management Studio中的活動監視器查看連接方式以及連接是否阻塞了其他連接。
在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)
其實,在查詢分析器/ Management Studio中運行EXEC sp_who2
給出比sp_who
更多信息。
除此之外,您可以設置SQL事件探查器來查看服務器的所有進出流量。 Profiler還可讓您精確縮小您正在觀看的內容。
對於SQL Server 2008:
START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler
記住分析器是一個真正的日誌記錄和觀看的應用程序。只要它正在運行,它將繼續記錄和觀察。它可能會填滿文本文件或數據庫或硬盤驅動器,因此請小心您所看到的內容和時間。
SQL Server Profiler是每個人都應該開始的地方! – Shane 2017-04-19 15:50:45
該產品內置有各種管理視圖。在SQL 2000上,你會使用sysprocesses。在SQL 2K5上有更多的視圖,如sys.dm_exec_connections,sys.dm_exec_sessions和sys.dm_exec_requests。
還有像sp_who這樣的程序可以利用這些視圖。在2K5 Management Studio中,您還可以看到活動監視器。
最後但並非最不重要的是有社區貢獻的腳本,如Who Is Active by Adam Machanic。
SQL 8.0.x也是。 SQL 2000 – 2009-06-02 22:35:52
如果您正在運行SQL Server 2005或2008年,您可以使用DMV的找到這個......
SELECT *
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
如果當前數據庫兼容級別低於90,則此查詢在SQL Server 2005下不起作用。如果當前數據庫兼容性較低,請切換到主數據庫以運行此查詢。 – 2017-11-10 08:38:02
在對象資源管理器中,深入到:服務器 - >管理 - >活動監視器。這將允許您查看當前服務器上的所有連接。
我在SQL 2008上看不到任何名爲Activity Monitor的活動監視器。 – jpierson 2013-08-07 19:38:44
我建議查詢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。
我們還使用Quest數據庫性能分析,爲服務器上正在進行的操作提供了非常好的可視化圖像。其中一件壞事是它告訴誰是受害者,但很難弄清誰在消耗資源。這雖然有幫助。 – dhi 2012-06-18 23:39:19
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
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
合適的劇本會是這樣的:
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
您可以使用下面的查詢來查找運行最後一個請求:
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/
作爲一個說明,在SQL Server活動監視器的SQL Server 2008可以發現通過右鍵單擊當前服務器並轉到上下文菜單中的「活動監視器」。如果您使用SQL Server Management Studio,我發現這是殺死進程的最簡單方法。
這應該是一個評論,但是,是的,它是如此有用,它獲得更多的知名度作爲答案:-)它現在幫助我。謝謝 – Loudenvier 2018-02-28 14:52:27
你應該嘗試非常有用的程序sp_whoIsActive
可以在這裏找到:http://sqlblog.com/files/default.aspx它是免費的。
我使用SQL Sever 8.0.x – BIBD 2009-06-02 20:44:12