Что такое тип ожидания 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