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