У меня есть запрос, который выполняется намного дольше обычного, и я не могу сказать, завис ли он.
Запрос выглядит примерно так:
INSERT XXXXXX WITH (TABLOCK)
SELECT * FROM YYYYYY with (NOLOCK)
WHERE ZZZZZZZZ = 1
Это вставит сотни миллионов строк. У меня есть индекс на ZZZZZZZZ.
Блокирующих сессий нет. Когда я проверяю sys.dm_exec_requests, он показывает, что последний тип ожидания PAGEIOLATCH_SH Я не уверен, что это значит, кроме того, что это как-то связано с вводом-выводом.
sys.dm_exec_sessions показывает состояние RUNNING, но sp_who2 показывает его как SUSPENDED.
Я попытался увидеть, растет ли таблица, но когда я вызываю sp_spaceused XXXXXX, я получаю те же значения.
Что еще я могу сделать?
ОБНОВИТЬ:
С помощью ответов на переполнение стека, Я обнаружил, что есть проблема ввода / вывода, и что мой запрос приводит к вставке в среднем около 600 записей в минуту).
Каков мой следующий шаг?
Что мне делать, прежде чем я начну думать, что мой диск выходит из строя?
Запрос выполняется, PAGEIOLATCH_SH типично при выполнении большого количества вставок, поскольку это ожидание в дисковой подсистеме. Индекс фактически снижает производительность, поскольку индекс получает вставку для каждой вставки в таблицу.
Сотни миллионов - это много рекордов, и это займет некоторое время, как долго они идут?
Если вы используете 2005 или 2008, я бы обязательно запустил скрипт sp_whoisactive, разработанный SQL MVP Adam Mechanic. Это в основном sp_who / sp_who2 на стероидах и должен дать вам всю необходимую информацию.