Высокое ожидание WRITELOG в базе данных SQL Azure

Aug 18 2020

Мой анализ WaitStats нашей базы данных SQL Azure показывает, что WRITELOG и HADR_SYNC_COMMIT являются счетчиками самого высокого ожидания. Это ресурс Premium 250 eDTU.

Сценарий

SELECT   TOP (10) wait_type,
                  CAST (([wait_time_ms] / 1000.0) AS DECIMAL (16, 2)) AS [WaitS],
                  CAST (100.0 * [wait_time_ms] / SUM([wait_time_ms]) OVER () AS DECIMAL (16, 2)) AS [Percentage]
FROM     sys.dm_db_wait_stats
ORDER BY [Percentage] DESC;

Я не могу найти много информации о том, как решить эту проблему в базе данных AZure SQL.

Любая помощь приветствуется.

Спасибо

Ответы

3 DavidBrowne-Microsoft Aug 18 2020 at 02:56

WRITELOG ожидает фиксации, пока записи журнала вашей транзакции будут закреплены на диске, а HADR_SYNC_COMMIT ожидает фиксации, пока записи журнала вашей транзакции будут отправлены по сети на вторичную реплику и закреплены на диске. Так что они очень, очень похожи на ожидания.

Оба значения указывают на то, что ваше приложение совершает много транзакций, возможно, слишком много.
А в версии Premium ваш файл журнала находится на локальном флэш-накопителе с очень низкой задержкой, поэтому большое количество ожиданий WRITELOG предполагает, что в вашем приложении есть что-то, что нужно исправить.

Если у вас есть какие-либо процессы, которые запускают INSERT, UPDATE или DELETE отдельных строк в жестком цикле, подумайте о том, чтобы заключить их в явную транзакцию, поэтому вам нужно только дождаться, пока журнал транзакций будет очищен в конце.

Как всегда, Query Store - ваш друг и может показать вам ожидания по запросу, а также вы можете проанализировать ожидания по сеансам в sys.dm_exec_session_wait_stats, чтобы увидеть, какие части вашей рабочей нагрузки страдают от этих ожиданий.

Вы можете лучше понять, сколько ваши клиенты ждут, сравнив прошедшее время сеанса и время процессора с временем ожидания. НАПРИМЕР

select s.session_id, 
       w.wait_type, 
       w.wait_time_ms, 
       w.signal_wait_time_ms, 
       s.total_elapsed_time, 
       s.cpu_time, 
       w.wait_time_ms/cast(nullif(s.total_elapsed_time,0) as float) wait_percent_of_elapsed
from  sys.dm_exec_sessions s
join sys.dm_exec_session_wait_stats w
  on s.session_id = w.session_id
where w.wait_time_ms > 0
order by wait_percent_of_elapsed desc