SQL Server - 创建索引时,为什么我的 SPID 会“暂停”但不会被阻止?

问题描述 投票:0回答:3

我有一个 SQL 2005 x64 服务器,当我尝试对其发出一些查询时(例如,当我尝试创建索引时),我的 SPID 立即进入“睡眠”状态,并且似乎无限期地等待。它没有被阻止(SP_WHO2 中的“BLKBY”列为空),并且 CPU 和 DiskIO 值非常小(每个都低于 300),并且没有增长。

我的查询可能在等待什么?如果我对正在索引的表执行 SELECT * 操作,我会在一分钟左右的时间内返回所有百万行,因此不会阻止表访问,甚至(看起来)表争用。

对我可以检查的其他事情有什么想法吗?我是否只需要屈服并重新启动我的 SQL 实例? :)

详细信息:我从 SSMS 中的另一个选项卡运行 CREATE INDEX,它永远不会返回 - 它只显示“正在执行”并且永远不会返回,所以我认为该过程没有被放弃。

sql-server suspend
3个回答
21
投票
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
可能会产生并行线程,并会自行挂起直到它们完成。


4
投票

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

-2
投票

命令完成,连接等待下一个命令。

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

来自网址: “这个问题与 SQL Server 一样古老。事实上,它可以追溯到 Sybase 时代,但仍在愚弄和困扰管理员。

具有睡眠/等待命令状态的会话只是一个客户端连接,没有对 SQL Server 的活动查询。下表显示了会话从运行状态到睡眠状态的转换。”

© www.soinside.com 2019 - 2024. All rights reserved.