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