Answers:
这将向您显示在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)
ms
量化s
。可能会发生溢出(对我来说是发生了)。
如果您运行的是SQL Server 2005或2008,则可以使用DMV查找...
SELECT *
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
我建议查询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
视图来查看发生了什么。
我建议您阅读以下文章。我从这里得到了这个参考。
产品内置了各种管理视图。在SQL 2000上,您将使用sysprocesses。在SQL 2K5上,还有更多视图,例如sys.dm_exec_connections,sys.dm_exec_sessions和sys.dm_exec_requests。
还有像sp_who这样的过程可以利用这些视图。在2K5 Management Studio中您还将获得活动监视器。
最后但并非最不重要的一点是,社区贡献的脚本,例如Adam Machanic的Who Who Active。
实际上,EXEC sp_who2
在Query Analyzer / Management Studio中运行比提供更多的信息sp_who
。
除此之外,您还可以设置SQL事件探查器以监视到服务器的所有入站和出站流量。Profiler还可以让您精确缩小所需的范围。
对于SQL Server 2008:
START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler
请记住,探查器确实是一个日志记录和观看应用程序。只要它正在运行,它将继续记录和监视。它可能会填满文本文件,数据库或硬盘驱动器,因此请注意观察的内容和时间。
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
注意,可以通过右键单击当前服务器并在上下文菜单中转到“活动监视器”来找到用于SQL Server 2008的SQL Server活动监视器。我发现如果使用SQL Server Management Studio,这是杀死进程的最简单方法。
这是一个查询,它将显示所有被阻止的查询。我不完全确定它是否只会显示缓慢的查询:
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
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/
试试这个:
它将为您提供所有用户查询。直到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
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
您应该尝试非常有用的过程sp_whoIsActive
,该过程可以在这里找到:http : //whoisactive.com,它是免费的。