У меня есть запрос, который занимает много времени в середине транзакции. Когда я понимаю wait_typeпроцесс, это так PAGEIOLATCH_SH.
Что означает этот тип ожидания и как его решить?
Ответы:
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операции над большими таблицами занимают очень много места.
SQL for Smartiesи Thinking in Sets) и мой блог, конечно :)
PAGEIOLATCH_SH Тип ожидания обычно появляется в результате фрагментированного или неоптимизированного индекса.
Часто причинами чрезмерного PAGEIOLATCH_SHожидания являются:
Чтобы попытаться решить проблему с высоким PAGEIOLATCH_SHтипом ожидания, вы можете проверить:
PAGEIOLATCH_SHтипов ожиданияВсегда имейте в виду, что в случае высокой безопасности зеркалирования или доступности синхронной фиксации в AlwaysOn AG PAGEIOLATCH_SHможно ожидать увеличения / чрезмерности .
Вы можете найти более подробную информацию по этой теме в статье Обработка чрезмерных типов ожидания SQL Server PAGEIOLATCH_SH