Log Cache

O Log Manager é responsável por todas as rotinas relacionadas com a escrita/leitura das informações no log. As informações são gravadas fisicamente em um arquivo de log. Um servidor SQL apresenta um Log Manager por banco de dados e pode ser monitorado através dos contadores do Performance Monitor:

SQLServer:Databases

  • Log Bytes Flushed/sec - Quantidade de bytes gravados em disco
  • Log Flush Wait Time - Tempo de espera para a gravação em disco
  • Log Flushes/sec - Número de gravações (flushes) no arquivo de log

As gravações em disco são feitas usando blocos de memória denominados Log Cache - também chamado de LogTable, que é uma estrutura em memória utilizada para armazenar os registros instantes antes de serem escritos em discos. Durante o processo de gravação de registros, as threads realizam a escrita de registros no Log Cache e o Log Manager realiza a gravação efetiva em disco.

O processo de gravação em log é realizado em duas etapas:

  1. As threads utilizam uma rotina de gravação no Log Cache, que fica em memória, e espera pela gravação. Múltiplas threads podem inserir novos registros no arquivo de log simultaneamente, entretanto, o acesso ao Log Cache é serializado. Após gravar as informações no cache, a thread aguarda no wait stats = WRITELOG.
  2. No instante seguinte, o processo de Log Manager correspondente do banco de dados processa o Log Cache ativo e realiza a gravação em disco. Quando os registros de log são gravados efetivamente em disco, o Log Manager sinaliza todas as threads que esperavam por WRITELOG.

No caso do TempDB, o Log Manager utiliza escritas assíncronas para evitar que as threads fiquem esperando pelo arquivo de log, uma vez que não existe processo de recovery do TempDB. Esse comportamento agiliza muito a performance das tabelas temporárias e, por isso, dificilmente observamos esperas por WRITELOG no TempDb.