SQL Server. Почему мой SPID будет ПРИОСТАНОВЛЕН, но не заблокирован при создании индекса?

У меня есть сервер SQL 2005 x64, и когда я пытаюсь выполнить некоторые запросы к нему (например, когда я пытаюсь создать индекс), мой SPID немедленно переходит в «спящий режим» и, кажется, ждет там неопределенное время. Он не блокируется (столбец «BLKBY» в SP_WHO2 пуст), а значения CPU и DiskIO очень малы (менее 300 каждый) и не растут.

Чего может ждать мой запрос? Если я выполняю SELECT * для таблицы, которую я индексирую, я получаю все миллионы строк обратно в течение минуты или около того, так что это не блокирует доступ к таблице или даже (кажется) конфликт таблиц.

Любые мысли о других вещах, которые я мог бы проверить? Мне просто нужно сдаться и перезапустить мой экземпляр SQL? :)

ДЕТАЛИ: я запускаю CREATE INDEX с другой вкладки в SSMS, и он никогда не возвращается — он просто показывает «Выполнение» и никогда не возвращается, поэтому я не думаю, что процесс был заброшен.


person SqlRyan    schedule 11.12.2009    source источник


Ответы (3)


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 может порождать параллельные потоки и приостанавливаться до тех пор, пока они не будут завершены.

person Remus Rusanu    schedule 11.12.2009
comment
отличный ответ. именно то, что я искал. blog.sqlauthority.com /2009/01/07/ заставил меня двигаться вперед, и это показало мне, в чем именно заключается проблема. - person Peter Munnings; 06.01.2012
comment
Спасибо, только что спас мой бекон! - person Preet Sangha; 22.04.2013
comment
А если возвращается только строка и ее статус приостановлен? - person nuzzolilo; 03.12.2015

Состояние «Приостановлено» иногда может вводить в заблуждение. Например, ваш запрос может быть «Приостановлен» во время ожидания завершения дискового ввода-вывода. Это можно проверить, выполнив приведенный ниже запрос и проверив столбец wait_type. PAGEIOLATCH_EX указывает, что запрос заблокирован из-за ожидания дискового ввода-вывода. Это не означает, что запрос не выполняется.

См. эту страницу для получения дополнительной информации о 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
person nuzzolilo    schedule 02.12.2015
comment
Спасибо за запрос. Это действительно помогло определить команду, которая занимает процессорное время и операции ввода-вывода. - person Ravinder Singh; 10.06.2017

Команда завершена, и соединение ожидает следующей команды.

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

Из URL-адреса: «Эта проблема стара, как SQL Server. Фактически, она восходит к дням Sybase, но продолжает одурачивать и озадачивать администраторов.

Сеанс с таким статусом ожидания/ожидания команды — это просто клиентское соединение без активного запроса к SQL Server. В таблице ниже показаны переходы из рабочего состояния в спящее для сеанса».

person Darryl Peterson    schedule 11.12.2009
comment
Но я запускаю команду из SSMS, и мой сеанс по-прежнему показывает «Выполнение» — похоже, что это вообще не выполняется, и оно перешло в «Приостановлено» слишком быстро, чтобы на самом деле завершиться. Интересная ссылка, хотя - я не знал об этой связи. - person SqlRyan; 11.12.2009