Что такое тип ожидания PAGEIOLATCH_SH в SQL Server?
У меня есть запрос, который занимает много времени в середине транзакции. Когда я получаю wait_type
процесса, это PAGEIOLATCH_SH
.
Что означает этот тип ожидания и как это можно разрешить?
Ответы
Ответ 1
Из MSDN:
PAGEIOLATCH_SH
Возникает при ожидании задачи на защелке для буфера, который находится в запросе I/O
. Запрос защелки находится в режиме общего доступа. Длинные ожидания могут указывать на проблемы с дисковой подсистемой.
На практике это почти всегда происходит из-за большого сканирования больших таблиц. Это почти никогда не происходит в запросах, которые эффективно используют индексы.
Если ваш запрос выглядит так:
Select * from <table> where <col1> = <value> order by <PrimaryKey>
убедитесь, что у вас есть составной индекс на (col1, col_primary_key)
.
Если у вас его нет, вам понадобится полный INDEX SCAN
, если выбрано PRIMARY KEY
, или SORT
, если выбран индекс на col1
.
Оба они представляют собой очень дисковые операции I/O
для больших таблиц.
Ответ 2
PAGEIOLATCH_SH
Тип ожидания обычно возникает как результат фрагментированного или неоптимизированного индекса.
Часто причиной чрезмерного типа ожидания PAGEIOLATCH_SH
являются:
- Подсистема ввода/вывода имеет проблему или неверно сконфигурирована.
- Перегруженная подсистема ввода-вывода другими процессами, которые производят высокую активность ввода-вывода
- Управление плохим индексом
- Заблуждение логического или физического диска
- Проблемы/задержки в сети
- Давление в памяти
- Синхронное зеркалирование и AlwaysOn AG
Чтобы попытаться решить проблему с высоким типом PAGEIOLATCH_SH
wait, вы можете проверить:
- SQL Server, запросы и индексы, так как очень часто это можно найти в качестве основной причины чрезмерных типов ожидания
PAGEIOLATCH_SH
- Для повышения давления памяти перед переходом на любую подсистему подсистемы ввода/вывода
Всегда помните, что в случае высокой безопасности Зеркалирование или наличие синхронной фиксации в AlwaysOn AG можно ожидать увеличения/увеличения PAGEIOLATCH_SH
.
Подробнее об этой теме вы можете найти в статье Обработка чрезмерных типов ожидания SQL Server PAGEIOLATCH_SH