У меня есть запрос, который занимает много времени в середине транзакции. Когда я понимаю 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