2009-06-02 30 views
154

¿Hay alguna manera de enumerar las consultas que se están ejecutando actualmente en el servidor MS SQL (a través del Administrador corporativo o SQL) y/o quién está conectado?Listar las consultas que se ejecutan en SQL Server

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

+1

Estoy usando SQL Sever 8.0.x – BIBD

Respuesta

157

Esto le mostrará los SPID que más tiempo lleva en el 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 se ejecuta para un SPID determinado a partir de los resultados, usar 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) 
26

Puede ejecutar el comando sp_who para obtener una lista de todos los usuarios, sesiones y procesos actuales. Luego puede ejecutar el comando KILL en cualquier spid que esté bloqueando a otros.

+2

Esto no siempre es útil. A veces, las consultas parecen generar child spid, especialmente cuando se utilizan OPENQUERY o servidores vinculados. Puede ser difícil determinar cuál es la consulta principal solo desde sp_who. – Nathan

0

Utilice Sql Server Profiler (menú de herramientas) para supervisar la ejecución de consultas y utilice Activity Monitor en Management Studio para ver cómo está conectado y si su conexión está bloqueando otras conexiones.

3

en 2005 puede hacer clic derecho en una base de datos, vaya a informes y hay toda una lista de informes sobre las transiciones y las cerraduras, etc ...

3

aquí es una consulta que mostrará cualquier consulta que están bloqueando. No estoy del todo seguro de si se acaba de 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) 
10

En realidad, corriendo EXEC sp_who2 en el Analizador de consultas/Management Studio da más información que sp_who.

Más allá de eso, 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 perfilador es realmente un registro y observación de aplicació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.

+0

¡SQL Server Profiler es donde todos deberían comenzar, definitivamente! – Shane

14

Existen 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 scripts aportados por la comunidad como el Who Is Active by Adam Machanic.

+1

SQL 8.0.x es aka. SQL 2000 –

74

Si está ejecutando SQL Server 2005 o 2008, se puede usar de la DMV para encontrar este ...

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

Esta consulta no funciona en SQL Server 2005 si el nivel de compatibilidad de la base de datos actual es inferior a 90. Si la compatibilidad de su base de datos actual es menor, cambie al db maestro para ejecutar esta consulta. –

7

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.

+0

No veo nada llamado Activity Monitor en Management en SQL 2008. – jpierson

14

Sugeriría consultar las sys vistas. 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 manera se puede obtener una TotalPagesAllocated que puede ayudar a determinar la spid que está teniendo todos los recursos del servidor. Hay muchas veces en que ni siquiera puedo mostrar el monitor de actividad y usar estas vistas sys para ver qué está pasando.

Le recomendaría que lea el siguiente artículo. I got this reference from here.

+0

También utilizamos el análisis Quest DB Performance que ofrece una muy buena imagen visual de lo que sucede en el servidor. Una de las cosas malas de eso es que dice quién es la víctima, pero es difícil saber quién está consumiendo los recursos. Esto ayudaría sin embargo. – dhi

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 

Y

KILL @spid 
+1

¿¡Esto estará bien! y si mato por spid. ¿Eso matará solo una consulta? mi duda es spid y session_is son únicos para cada consulta que se ejecuta en esa sesión o servidor? – buttowski

+0

¿De dónde viene t?Esta consulta tiene errores de sintaxis para mí. – jpierson

+0

Creo que esta consulta se escribe sobre la marcha, así que la edito;). –

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

El guión adecuado 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 
3

Puede utilizar a continuación consulta para encontrar correr última petició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 

mediante el siguiente guión también se puede encontrar el número 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 más información, visite: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/

3

Como nota, el Monitor de actividad de SQL Server para SQL Server 2008 se puede encontrar haciendo clic derecho en su servidor actual y yendo a "Monitor de actividad" en el menú contextual. Descubrí que esta era la manera más fácil de eliminar procesos si está utilizando SQL Server Management Studio.

+0

Esto debería haber sido un comentario, pero sí, es muy útil y tiene más visibilidad como respuesta :-) Y me ayudó en este momento. Gracias – Loudenvier

Cuestiones relacionadas