我有一个 SQL 2005 x64 服务器,当我尝试对其发出一些查询时(例如,当我尝试创建索引时),我的 SPID 立即进入“睡眠”状态,并且似乎无限期地等待。它没有被阻止(SP_WHO2 中的“BLKBY”列为空),并且 CPU 和 DiskIO 值非常小(每个都低于 300),并且没有增长。
我的查询可能在等待什么?如果我对正在索引的表执行 SELECT * 操作,我会在一分钟左右的时间内返回所有百万行,因此不会阻止表访问,甚至(看起来)表争用。
对我可以检查的其他事情有什么想法吗?我是否只需要屈服并重新启动我的 SQL 实例? :)
详细信息:我从 SSMS 中的另一个选项卡运行 CREATE INDEX,它永远不会返回 - 它只显示“正在执行”并且永远不会返回,所以我认为该过程没有被放弃。
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>;
这不仅会显示请求的状态,还会显示该请求生成的所有任务。在线
CREATE INDEX
可能会产生并行线程,并会自行挂起直到它们完成。
Suspended
状态有时可能会产生误导。例如,在等待磁盘 I/O 完成时,您的查询可能是 Suspended
。这可以通过运行以下查询并检查 wait_type
列来验证。 PAGEIOLATCH_EX
表示查询因等待磁盘I/O而被阻塞。这并不意味着查询没有取得进展。
请参阅 此页,了解有关
PAGEIOLATCH_EX
的更多信息
这是返回上述信息的查询
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
命令完成,连接等待下一个命令。
来自网址: “这个问题与 SQL Server 一样古老。事实上,它可以追溯到 Sybase 时代,但仍在愚弄和困扰管理员。
具有睡眠/等待命令状态的会话只是一个客户端连接,没有对 SQL Server 的活动查询。下表显示了会话从运行状态到睡眠状态的转换。”