usuarios - Listar las consultas que se ejecutan en SQL Server
ver conexiones activas sql server (16)
¿Hay alguna manera de enumerar las consultas que se están ejecutando actualmente en MS SQL Server (ya sea a través del Administrador corporativo o SQL) y / o quién está conectado?
Creo que tengo una consulta de ejecución muy larga que se está ejecutando en uno de mis servidores de bases de datos y me gustaría rastrearla y detenerla (o la persona que la sigue iniciando).
Como nota, el Monitor de actividad del servidor SQL para SQL Server 2008 se puede encontrar haciendo clic con el botón derecho en su servidor actual y yendo a "Monitor de actividad" en el menú contextual. Descubrí que esta era la forma más fácil de eliminar procesos si está utilizando SQL Server Management Studio.
Debería probar el procedimiento muy útil sp_whoIsActive
que se puede encontrar aquí: http://sqlblog.com/files/default.aspx y es gratuito.
El script correcto sería así:
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
En el Explorador de objetos, desplácese hasta: Servidor -> Administración -> Monitor de actividad. Esto le permitirá ver todas las conexiones en el servidor actual.
En realidad, ejecutar EXEC sp_who2
en Query Analyzer / Management Studio brinda más información que sp_who
.
Además, puede configurar el Analizador de SQL para ver todo el tráfico de entrada y salida del servidor. Profiler también te permite restringir exactamente lo que estás buscando.
Para SQL Server 2008:
START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler
Tenga en cuenta que el generador de perfiles es realmente una aplicación de registro y observación. Continuará registrándose y mirando mientras se esté ejecutando. Puede llenar archivos de texto o bases de datos o discos duros, así que tenga cuidado con lo que tiene que ver y durante cuánto tiempo.
Esto le mostrará los SPID más antiguos en un servidor SQL 2000 o SQL 2005:
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
Si necesita ver el SQL ejecutándose para un spid dado a partir de los resultados, use algo como esto:
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)
Hay varias vistas de administración integradas en el producto. En SQL 2000 usaría sysprocesses . En SQL 2K5 hay más vistas como sys.dm_exec_connections , sys.dm_exec_sessions y sys.dm_exec_requests .
También hay procedimientos como sp_who que aprovechan estas vistas. En 2K5 Management Studio también obtienes Activity Monitor.
Y por último, pero no menos importante, hay guiones aportados por la comunidad como Who Is Active de Adam Machanic .
Puede usar la consulta a continuación para encontrar la última solicitud en ejecución:
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
Usando la secuencia de comandos a continuación también puede encontrar la cantidad de conexiones por base de datos:
SELECT
DB_NAME(DBID) AS DataBaseName
,COUNT(DBID) AS NumberOfConnections
,LogiName
FROM sys.sysprocesses
WHERE DBID > 0
GROUP BY DBID, LogiName
Para obtener más información, visite: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/
Si está ejecutando SQL Server 2005 o 2008, puede usar el DMV para encontrar esto ...
SELECT *
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
- Más acerca de sys.dm_exec_requests
- Más acerca de sys.dm_exec_sql_text
Sugeriría consultar las vistas de sys
. algo similar a
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
De esta forma, puede obtener un TotalPagesAllocated
que puede ayudarlo a descubrir el spid
que está tomando todos los recursos del servidor. Hay muchas veces en las que ni siquiera puedo mostrar el monitor de actividad y usar estas vistas de sistema para ver qué está sucediendo.
Te recomendaría que leyeras el siguiente artículo. Obtuve esta referencia desde aquí .
Use Sql Server Profiler (menú de herramientas) para supervisar la ejecución de consultas y use el monitor de actividad en Management Studio para ver cómo está conectado y si su conexión está bloqueando otras conexiones.
aquí hay una consulta que mostrará las consultas que están bloqueando. No estoy del todo seguro de si solo mostrará consultas lentas:
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 )
en 2005 puede hacer clic derecho en una base de datos, ir a los informes y hay una lista completa de informes sobre transiciones y bloqueos, etc.
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,
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
Y
KILL @spid