2009-12-11 7 views
9

Tengo un servidor SQL 2005 x64, y cuando intento emitir algunas consultas contra él (por ejemplo, cuando intento crear un índice), mi SPID pasa a "inactivo" inmediatamente y parece esperar allí indefinidamente. No está siendo bloqueado (la columna "BLKBY" en SP_WHO2 está vacía), y los valores de CPU y DiskIO son muy pequeños (menos de 300 cada uno) y no están creciendo.Servidor SQL: ¿por qué mi SPID se "SUSPENDÍA" pero no se bloqueó, mientras se creaba un índice?

¿Qué podría estar esperando posiblemente mi consulta? Si hago un SELECCIONAR * fuera de la tabla que estoy indexando, recupero todos los millones de filas dentro de un minuto más o menos, por lo que no está bloqueado el acceso a la tabla, o incluso (parece) la contención de la tabla.

¿Alguna idea sobre otras cosas que podría verificar? ¿Solo necesito ceder y reiniciar mi instancia de SQL? :)

DETALLES: Estoy ejecutando CREATE INDEX desde otra pestaña en SSMS, y nunca regresa - simplemente muestra "Ejecutando" y nunca regresa, por lo que no creo que el proceso haya sido abandonado.

Respuesta

19
select * 
from sys.dm_exec_requests r 
join sys.dm_os_tasks t on r.session_id = t.session_id 
where r.session_id = <spid of create index>; 

Esto mostrará no solo el estado de la solicitud, sino también todas las tareas generadas por la solicitud. Un INDICE DE CREACIÓN en línea puede engendrar hilos paralelos y se suspenderá hasta que finalice.

+0

excelente respuesta. justo lo que estaba buscando. http://blog.sqlauthority.com/2009/01/07/sql-server-find- current-arunning-query-t-sql/ me puso en marcha, y esto me mostró exactamente dónde estaba el problema. –

+0

¡Gracias, me salvó el tocino! –

+0

¿Y si solo se devuelve una fila y su estado está "suspendido"? – Nuzzolilo

-1

El comando se completó y la conexión está esperando el siguiente comando.

http://blogs.msdn.com/psssql/archive/2008/04/21/how-it-works-what-is-a-sleeping-awaiting-command-session.aspx

Desde la URL: "Este problema es tan antiguo como SQL Server De hecho, se remonta a los días de Sybase, pero continúa para engañar y administradores del rompecabezas

Una sesión con ese estado.. El comando "dormir/esperar" es simplemente una conexión de cliente sin consulta activa al servidor SQL. La tabla siguiente muestra las transiciones desde la ejecución hasta los estados de suspensión de una sesión ".

+0

Pero estoy ejecutando el comando desde SSMS, y mi sesión aún muestra "Ejecutar" - parece que no se hizo en absoluto, y pasó a "Suspendido" muy rápido como para completarse. Un enlace interesante, sin embargo, no estaba al tanto de esa conexión. – SqlRyan

1

El estado 'Suspendido' a veces puede ser engañoso. Por ejemplo, su consulta podría estar 'Suspendida' mientras espera que se complete la E/S de disco. Esto se puede verificar ejecutando la consulta siguiente y marcando la columna wait_type. PAGEIOLATCH_EX indica que la consulta está bloqueada debido a la espera de E/S de disco. Esto no significa que la consulta no está progresando.

Ver this page para obtener más información sobre PAGEIOLATCH_EX

Y aquí es la consulta que devuelve la información antes mencionada

SELECT qs.percent_complete , 
     qs.session_id , 
     scheduler_id , 
     blocking_session_id , 
     qs.status , 
     command , 
     wait_time , 
     wait_type , 
     last_wait_type , 
     wait_resource , 
     ST.text , 
     host_name , 
     program_name 
FROM sys.dm_exec_requests qs 
     LEFT JOIN sys.dm_exec_sessions es ON (qs.session_id = es.session_id) 
     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS ST 
+0

Gracias por la consulta. De hecho, fue útil para señalar el comando que está tomando tiempo de CPU e IO. –

Cuestiones relacionadas