2009-12-11 3 views
9

Ich habe einen SQL 2005 x64-Server, und wenn ich versuche, einige Abfragen dagegen (zum Beispiel, wenn ich versuche, einen Index zu erstellen), meine SPID wird sofort zu "schlafen", und scheint dort auf unbestimmte Zeit zu warten. Es wird nicht blockiert (die "BLKBY" -Spalte in SP_WHO2 ist leer) und die CPU- und DiskIO-Werte sind sehr klein (unter jeweils 300) und wachsen nicht.SQL Server - Warum sollte mein SPID "SUSPENDED" sein, aber nicht blockiert werden, während ein Index erstellt wird?

Worauf könnte meine Abfrage möglicherweise warten? Wenn ich SELECT * aus der Tabelle mache, die ich indexiere, bekomme ich alle Millionen Zeilen innerhalb einer Minute zurück, also ist es kein blockierter Tabellenzugriff oder sogar (scheinbar) Tabellenkonflikt.

Irgendwelche Gedanken zu anderen Dingen, die ich überprüfen könnte? Muss ich nur meine SQL-Instanz aufgeben und neu starten? :)

DETAILS: Ich führe den CREATE INDEX von einem anderen Tab in SSMS, und es wird nie zurückkehren - es zeigt nur "Executing" und kehrt nie zurück, so glaube ich nicht, dass der Prozess aufgegeben wurde.

Antwort

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

Dies zeigt nicht nur den Status der Anfrage, sondern auch alle von der Anfrage erzeugten Aufgaben an. Ein Online CREATE INDEX kann parallele Threads erzeugen und wird sich selbst aussetzen, bis sie fertig sind.

+0

ausgezeichnete Antwort. genau das was ich gesucht habe. http://blog.sqlauthority.com/2009/01/07/sql-server-find-current-ly-running-query-t-sql/ brachte mich zum Laufen, und das zeigte mir genau, wo das Problem war. –

+0

Danke, habe gerade meinen Speck gerettet! –

+0

Und wenn nur Zeile zurückgegeben wird und ihr Status "ausgesetzt" ist? – Nuzzolilo

-1

Der Befehl ist abgeschlossen und die Verbindung wartet auf den nächsten Befehl.

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

Von der URL: „Dieses Problem ist so alt wie SQL Server In der Tat, es zurück zu Sybase Tagen geht aber täuschen und Puzzle-Administratoren weiterhin

Eine Sitzung mit diesem Status.. Der Befehl "Schlafen/Warten" ist lediglich eine Client-Verbindung ohne aktive Abfrage an den SQL Server. Die folgende Tabelle zeigt die Übergänge von der Ausführung in den Schlafstatus für eine Sitzung. "

+0

Aber ich den Befehl renne von SSMS zurückkehrt, und meine Session zeigt noch „Ausführen“ - es scheint überhaupt nicht getan zu sein, und es ging zu "Suspended" viel zu schnell, um tatsächlich abgeschlossen zu haben. Interessanter Link - ich war mir dieser Verbindung nicht bewusst. – SqlRyan

1

Der Status 'Unterbrochen' kann manchmal irreführend sein. Ihre Abfrage könnte beispielsweise "Suspended" sein, während Sie auf den Abschluss der Datenträger-E/A warten. Dies kann überprüft werden, indem die folgende Abfrage ausgeführt und die Spalte wait_type überprüft wird. PAGEIOLATCH_EX zeigt an, dass die Abfrage wegen Warten auf Datenträger-E/A blockiert wird. Dies bedeutet nicht, dass die Abfrage keine Fortschritte macht.

Siehe this page für weitere Informationen über PAGEIOLATCH_EX

Und hier ist die Abfrage, die die oben genannten Informationen

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

Vielen Dank für die Abfrage. Es war in der Tat hilfreich, den Befehl, der CPU-Zeit und IO benötigt, zu pinnen. –

Verwandte Themen