Как узнать, почему мой запрос выполняется так медленно?

Как узнать, почему мой запрос выполняется так медленно?

У меня есть запрос, обработка которого занимает гораздо больше времени, чем обычно, и я не могу понять, завис ли он.

Запрос примерно такой:

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 на стероидах, и он должен дать вам всю необходимую информацию.

http://sqlblog.com/files/folders/beta/entry27502.aspx

Связанный контент