
У меня есть запрос, обработка которого занимает гораздо больше времени, чем обычно, и я не могу понять, завис ли он.
Запрос примерно такой:
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 записей).
Каков мой следующий шаг?
Что я могу сделать, прежде чем предположить, что мой диск выходит из строя?
решение1
Запрос выполняется, PAGEIOLATCH_SH типично при выполнении большого количества вставок, поскольку это ожидание на дисковой подсистеме. Индекс фактически снижает производительность, поскольку индекс получает вставку для каждой вставки в таблицу.
Сотни миллионов — это очень много записей, и это займет некоторое время. Как долго это продолжается?
решение2
Если вы используете 2005 или 2008, я бы определенно запустил скрипт sp_whoisactive, разработанный SQL MVP Адамом Механиком. По сути, это sp_who/sp_who2 на стероидах, и он должен дать вам всю необходимую информацию.