I have a SQL 2005 x64 server, and when I attempt to issue some queries against it (for example, when I try to create an index), my SPID goes to "sleeping" immediately, and seems to wait there indefinitely. It's not being blocked (the "BLKBY" column in SP_WHO2 is empty), and the CPU and DiskIO values are very small (under 300 each), and not growing.
What could my query possibly be waiting for? If I do a SELECT * off the table I'm indexing, I get all million rows back within a minute or so, so it's not blocked table access, or even (it seems) table contention.
Any thoughts on other things I could check? Do I just need to give in and restart my SQL instance? :)
DETAILS: I'm running the CREATE INDEX from another tab in SSMS, and it's never returning - it just shows "Executing" and never returns, so I don't think the process has been abandoned.
Suspended just means that the SPID is waiting for a resource, such as a page to be read from disk into memory. When a SPID is suspended, the reason it is waiting is logged as a wait event. Runnable means the SPID is waiting for an available scheduler, usually called a processor or CPU.
Suspended Status means that the request currently is inactive because it is waiting on a resource and there is a good chance the request will start once the needed resource will be available.
Check the status of the query using the SP_who2 command. After some time, use the KILL command to KILL SPID using the following command. Execute this command in a new query window. Once we execute the KILL SPID command, SQL Server starts the ROLLBACK process for this query.
An SPID holds locks on a set of resources for an extended period of time before releasing them. This type of blocking resolves itself over time but can cause performance degradation. An SPID holds locks on a set of resources and never releases them.
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>;
This will show not only the status of the request, but also all the tasks spawned by the request. An online CREATE INDEX may spawn parallel threads and will suspend itself until they're finish.
The 'Suspended' state can sometimes be misleading. For example, your query could be 'Suspended' while waiting for disk I/O to complete. This can be verified by running the below query, and checking the wait_type column. PAGEIOLATCH_EX
indicates that the query is blocked due to waiting for disk I/O. This doesn't mean that the query is not making progress.
See this page for more information about PAGEIOLATCH_EX
And here is the query that returns the aforementioned information
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With