10

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

我的查询可能在等待什么?如果我从正在索引的表中执行 SELECT *,我会在一分钟左右的时间内恢复所有数百万行,因此它不会阻止表访问,甚至(似乎)表争用。

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

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

4

3 回答 3

20
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 可能会产生并行线程,并将自行挂起,直到它们完成。

于 2009-12-11T21:29:46.793 回答
3

“暂停”状态有时可能会产生误导。例如,您的查询可能在等待磁盘 I/O 完成时被“暂停”。这可以通过运行以下查询并检查 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
于 2015-12-02T22:32:31.787 回答
-2

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

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

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

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

于 2009-12-11T20:07:24.243 回答