Назад | Перейти на главную страницу

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

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

Запрос выглядит примерно так:

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

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