2009-12-11 8 views
9

Ho un server x64 SQL 2005 e quando tento di inviare alcune query su di esso (ad esempio, quando provo a creare un indice), il mio SPID va a "dormire" immediatamente e sembra che ci rimanga per un tempo indefinito. Non viene bloccato (la colonna "BLKBY" in SP_WHO2 è vuota) e i valori CPU e DiskIO sono molto piccoli (meno di 300 ciascuno) e non in crescita.SQL Server - Perché il mio SPID dovrebbe essere "SUSPENDED" ma non bloccato durante la creazione di un indice?

Cosa potrebbe aspettarsi la mia domanda? Se faccio un SELECT * fuori dalla tabella sto indicizzando, ottengo tutte le milioni di righe indietro entro un minuto o così, quindi non è l'accesso alla tabella bloccata, o addirittura (sembra) contesa della tabella.

Qualche idea su altre cose che potrei controllare? Devo solo arrendermi e riavviare la mia istanza SQL? :)

DETTAGLI: Sto eseguendo il CREATE INDEX da un'altra scheda in SSMS, e non torna mai più - mostra solo "Esecuzione" e non ritorna mai, quindi non penso che il processo sia stato abbandonato.

risposta

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>; 

Questo mostrerà non solo lo stato della richiesta, ma anche tutti i compiti generati dalla richiesta. Un INDICE CREATO online può generare thread paralleli e sospendere se stesso fino al loro completamento.

+0

ottima risposta. Proprio quello che stavo cercando. http://blog.sqlauthority.com/2009/01/07/sql-server-find-currently-running-query-t-sql/ mi ha fatto andare, e questo mi ha mostrato esattamente dove si trovava il problema. –

+0

Grazie appena salvato il mio bacon! –

+0

E se viene restituita solo una riga e il suo stato è "sospeso"? – Nuzzolilo

-1

Il comando è completato e la connessione è in attesa del comando successivo.

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

dall'URL: "Questo problema è vecchio come SQL Server, infatti, risale ai giorni di Sybase, ma continua a ingannare e amministratori di puzzle

Una sessione con tale status.. di comando in sospeso/in attesa è semplicemente una connessione client senza alcuna query attiva su SQL Server. La tabella seguente mostra le transizioni dagli stati di esecuzione a quelli di sospensione per una sessione. "

+0

ma sto eseguendo il comando da SSMS, e la mia sessione mostra ancora "Esecuzione" - non sembra essere fatto affatto, e è andato a "Sospeso" troppo velocemente per aver effettivamente completato. Collegamento interessante, però - non ero a conoscenza di questa connessione. – SqlRyan

1

Lo stato "Sospeso" può a volte essere fuorviante. Ad esempio, la query potrebbe essere "Sospesa" durante l'attesa per il completamento dell'I/O del disco. Questo può essere verificato eseguendo la query sottostante e controllando la colonna wait_type. PAGEIOLATCH_EX indica che la query è bloccata a causa di attesa I/O del disco. Questo non significa che la query non stia facendo progressi.

Vedi this page per ulteriori informazioni su PAGEIOLATCH_EX

E qui è la query che restituisce le informazioni di cui sopra

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

Grazie per la richiesta. È stato davvero utile puntare il comando che sta prendendo tempo CPU e IO. –

Problemi correlati