High PAGELATCH_ * и WRITELOG ждет. Они связаны?

11

Мы наблюдаем очень высокие типы ожидания PAGELATCH_EX и PAGELATCH_SH вместе с высокими ожиданиями WRITELOG. Я диагностировал запрос, вызывающий ожидание PAGELATCH, и могу устранить их, уменьшив частоту вставки в занятый кластерный первичный ключ, определенный со значением IDENTITY. Я понимаю, что это явление известно как конфликт защелки вставки последней страницы.

Однако мой вопрос заключается в том, что при вставке новой записи SQL Server принимает эксклюзивный PAGELATCH_EX на странице буфера, вставляет запись на страницу буфера, записывает запись в журнал транзакций и затем выпускает эксклюзивный PAGELATCH_EX в виде подробных https: // www.microsoft.com/en-ie/download/details.aspx?id=26665 Стр. 24. Или сначала записывает запись в журнал транзакций перед тем, как взять PAGELATCH_EX в качестве подробного «Разрешение конфликта PAGELATCH при высококонкурентных» рабочих нагрузках INSERT - Справочная информация Руководство SQLCAT по: реляционному движку

Если запись записывается в журнал за пределами механизма фиксации, я могу исключить медленную запись на диск, так как причина большого PAGELATCH ждет. Но если защелка удерживается до тех пор, пока запись не укрепится для записи в журнал, я, вероятно, должен принять во внимание WRITELOG.

Кроме того, наличие нескольких некластеризованных индексов приведет к тому, что защелка PAGELATCH_ * будет удерживаться дольше, т. Е. Если таблица имеет кластеризованные и несколько некластеризованных индексов, добавляются ли защелки и высвобождаются ли они на каждой странице буфера индекса одновременно?

Обновление 1 После прочтения confio-sql-server-writelog-wait слайд 2 и общая архитектура WAL. Теперь я понимаю, что шаг «Записать запись журнала, что строка была изменена», подробно описанный в обеих статьях, относится к регистрации SQL Server изменений в кэше журнала транзакций, а не на диске. После завершения транзакции или заполнения буфера все записи немедленно сбрасываются на диск.

Pixelated
источник
1
Глядя на вопрос, очень похожий на этот момент, прямо сейчас ...
Дэйв Лоуренс,
Вы смотрели на возможно высокие VLF, вызывающие проблемы?
Кин Шах
@Kin, ты имеешь в виду медленную очистку журнала на диск с открытой защелкой PAGELATCH_EX и вызывающей конфликт защелок?
Pixelated
Нет причин, по которым реализация SQL Server должна генерировать запись журнала под защелкой страницы. Зачем им это делать? Неправдоподобно. Кроме того, если бы записи логов выполнялись с помощью patchlatch, вы бы почти никогда не увидели, что WRITELOG ждет. За один раз может быть принят только один тип ожидания.
USR

Ответы:

1

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

Вы должны заметить, что защелка защищает только физическую целостность страницы, пока она находится в памяти, поэтому защелка будет выполняться, когда страница находится в памяти. Предположим, что запись вставляется, и для этой страницы необходимо получить. Сначала страница будет заблокирована и помещена в память, затем она будет заблокирована и информация будет записана. Процесс после этого будет

  • Создать запись журнала

  • Обновить страницу LSN, чтобы она соответствовала записи журнала

  • Изменить данные (испачкать страницу)

  • Отпустить защелку

  • Подтвердить начало транзакции

  • FlushToLSN Commit

  • Отпустить замки

  • Совершить транзакцию завершено

Для более подробной информации и объяснения вышеупомянутых шагов, пожалуйста, прочитайте презентационный блог Боба Дорра о вводе / выводе

Ожидания Pagelatch * не относятся к ожиданиям ввода-вывода, и я видел большую часть времени, когда эти ожидания являются заметными из-за конфликта распределения. Я догадываюсь, что это как-то связано с тем, как tempdb is configured. Итак, как настроен ваш tempdb? Сколько файлов данных tempdb присутствует? Убедитесь, что они имеют одинаковый рост и одинаковый размер. Когда создается новая страница, системные страницы, такие как страницы GAM, SGAM и PFS, должны быть обновлены или доступны, а когда SQL Server обнаруживает конфликт при доступе к этим страницам, такое ожидание становится очевидным .

Shanky
источник
Привет @Shanky, основан на sys.dm_os_waiting_tasks.resource_description в сочетании с DBCC PAGE и типом PAGELATCH_ *. Я исключил tempDB. Основываясь на цепочке событий Боба Дорра, похоже, что шаг «Создать запись журнала» завершен в механизме фиксации?
Pixelated
3
Оба являются взаимоисключающими событиями, и запись в файл журнала не имеет ничего общего с фиксацией его просто SQL Server по протоколу WAL для записи информации в журнал перед фактическим совершением транзакции
Shanky