Что такое тип ожидания PAGEIOLATCH_SH в SQL Server?

97

У меня есть запрос, который занимает много времени в середине транзакции. Когда я понимаю wait_typeпроцесс, это так PAGEIOLATCH_SH.

Что означает этот тип ожидания и как его решить?

Райан
источник

Ответы:

117

Из документации Microsoft :

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операции над большими таблицами занимают очень много места.

Quassnoi
источник
Это очень простой запрос. Выберите * из <table>, где <col1> = <value> в порядке <PrimaryKey>. У нас также есть индекс только для col1, и мы попытались восстановить индекс.
Райан
Можете ли вы предложить некоторые ресурсы для изучения того, что у вас есть, что требует интенсивного использования диска, что требует полного сканирования индекса, что требует сортировки и т. Д.
Грег Б.
1
@GregB: если у вас уже есть базовые знания SQL, вы можете прочитать книги Джо Селко (все, но особенно SQL for Smartiesи Thinking in Sets) и мой блог, конечно :)
Quassnoi
3
Это действительно указывает на ошибку в нашей дисковой подсистеме. Диск RAID отказал без запуска системы мониторинга. Проверка журналов событий показала, что SMART действительно пометил диск как неисправный.
Gomibushi
7

PAGEIOLATCH_SH Тип ожидания обычно появляется в результате фрагментированного или неоптимизированного индекса.

Часто причинами чрезмерного PAGEIOLATCH_SHожидания являются:

  • Подсистема ввода-вывода неисправна или неправильно настроена
  • Подсистема ввода-вывода перегружена другими процессами, которые производят высокую активность ввода-вывода
  • Плохое управление индексами
  • Заблуждение о логическом или физическом приводе
  • Проблемы с сетью / задержка
  • Давление памяти
  • Синхронное зеркальное отображение и AlwaysOn AG

Чтобы попытаться решить проблему с высоким PAGEIOLATCH_SHтипом ожидания, вы можете проверить:

  • SQL Server, запросы и индексы, так как очень часто это может быть основной причиной чрезмерных PAGEIOLATCH_SHтипов ожидания
  • Для нехватки памяти перед прыжком в любую подсистему ввода-вывода.

Всегда имейте в виду, что в случае высокой безопасности зеркалирования или доступности синхронной фиксации в AlwaysOn AG PAGEIOLATCH_SHможно ожидать увеличения / чрезмерности .

Вы можете найти более подробную информацию по этой теме в статье Обработка чрезмерных типов ожидания SQL Server PAGEIOLATCH_SH

Г. Хант
источник