Espera alta de WRITELOG no banco de dados SQL do Azure

Aug 18 2020

Minha análise WaitStats de nosso banco de dados SQL do Azure está mostrando WRITELOG e HADR_SYNC_COMMIT como contador da espera mais alta. Este é um recurso Premium 250 eDTU.

Roteiro

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;

Não consigo encontrar muitas informações sobre como resolver isso no banco de dados SQL do AZure.

Qualquer ajuda é apreciada.

Obrigado

Respostas

3 DavidBrowne-Microsoft Aug 18 2020 at 02:56

WRITELOG está aguardando confirmação para que os registros de log de sua transação sejam protegidos em disco e HADR_SYNC_COMMIT está aguardando confirmação para que os registros de log de sua transação sejam enviados pela rede para uma réplica secundária e protegidos em disco. Portanto, são esperas muito, muito semelhantes.

Ambos indicam que seu aplicativo está confirmando muitas transações, talvez até demais.
E no premium, seu arquivo de log está em uma unidade flash local com latência muito baixa, portanto, sofrer muitas esperas de WRITELOG sugere que há algo que precisa ser corrigido em seu aplicativo.

Se você tiver quaisquer processos que executam INSERT, UPDATE ou DELETE de linhas únicas em um loop fechado, considere envolvê-los em uma transação explícita, de modo que você só precise esperar que o log de transações seja liberado no final.

Como sempre , o Query Store é seu amigo e pode mostrar as esperas por consulta, e você também pode analisar as esperas por sessão em sys.dm_exec_session_wait_stats para ver quais partes de sua carga de trabalho estão sofrendo essas esperas.

Você pode ter uma noção melhor de quanto seus clientes estão esperando comparando o tempo decorrido da sessão e o tempo da CPU com os tempos de espera. POR EXEMPLO

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