Ми спостерігаємо дуже високі типи очікування 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 слайд другий та загальна архітектура WAL. Зараз я розумію, що крок "Запис запису в журнал, що рядок був змінений", детально описаний в обох документах, стосується реєстрації на SQL Server зміни кеша журналу транзакцій, а не диска. Після завершення транзакції або заповнення буфера всі записи негайно передаються на диск.