Мы наблюдаем очень высокие типы ожидания 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 изменений в кэше журнала транзакций, а не на диске. После завершения транзакции или заполнения буфера все записи немедленно сбрасываются на диск.
Ответы:
Вы должны заметить, что защелка защищает только физическую целостность страницы, пока она находится в памяти, поэтому защелка будет выполняться, когда страница находится в памяти. Предположим, что запись вставляется, и для этой страницы необходимо получить. Сначала страница будет заблокирована и помещена в память, затем она будет заблокирована и информация будет записана. Процесс после этого будет
Создать запись журнала
Обновить страницу LSN, чтобы она соответствовала записи журнала
Изменить данные (испачкать страницу)
Отпустить защелку
Подтвердить начало транзакции
FlushToLSN Commit
Отпустить замки
Совершить транзакцию завершено
Для более подробной информации и объяснения вышеупомянутых шагов, пожалуйста, прочитайте презентационный блог Боба Дорра о вводе / выводе
Ожидания Pagelatch * не относятся к ожиданиям ввода-вывода, и я видел большую часть времени, когда эти ожидания являются заметными из-за конфликта распределения. Я догадываюсь, что это как-то связано с тем, как
tempdb is configured
. Итак, как настроен ваш tempdb? Сколько файлов данных tempdb присутствует? Убедитесь, что они имеют одинаковый рост и одинаковый размер. Когда создается новая страница, системные страницы, такие как страницы GAM, SGAM и PFS, должны быть обновлены или доступны, а когда SQL Server обнаруживает конфликт при доступе к этим страницам, такое ожидание становится очевидным .источник