Attesa WRITELOG elevata nel database SQL di Azure

Aug 18 2020

L'analisi di My WaitStats del nostro database SQL di Azure mostra WRITELOG e HADR_SYNC_COMMIT come contatore dell'attesa più alta. Questa è una risorsa Premium 250 eDTU.

Sceneggiatura

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;

Non riesco a trovare molte informazioni su come affrontare questo problema nel database AZure SQL.

Qualsiasi aiuto è apprezzato.

Grazie

Risposte

3 DavidBrowne-Microsoft Aug 18 2020 at 02:56

WRITELOG è in attesa del commit affinché i record del log della transazione vengano protetti su disco e HADR_SYNC_COMMIT attende del commit affinché i record del log della transazione vengano inviati in rete a una replica secondaria e rafforzati su disco. Quindi sono attese molto, molto simili.

Entrambi indicano che la tua applicazione sta eseguendo molte transazioni, forse troppe.
E su premium il tuo file di registro si trova su un'unità flash locale con latenza molto bassa, quindi subire molte attese WRITELOG suggerisce che c'è qualcosa che deve essere corretto nella tua applicazione.

Se disponi di processi che eseguono INSERT, UPDATE o DELETE di singole righe in un ciclo stretto, considera di avvolgerli in una transazione esplicita, quindi devi solo attendere che il registro delle transazioni venga svuotato alla fine.

Come sempre Query Store è tuo amico e può mostrarti le attese per query e puoi anche analizzare le attese per sessione in sys.dm_exec_session_wait_stats per vedere quali parti del tuo carico di lavoro stanno subendo queste attese.

Puoi avere un'idea migliore di quanto i tuoi clienti stanno aspettando confrontando il tempo trascorso della sessione e il tempo della CPU con i tempi di attesa. PER ESEMPIO

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