«

»

set 11

Limpando o cache do SQL

Todo mundo que eu conheci até hoje reinicia a instância para esvaziar o buffer que o SQL faz em memória. Veja como fazer isso sem reiniciar a instância, serviços ou servidor.

 

Devo alertá-los que esta prática, apesar de não gerar a indisponibilidade dos outros métodos, não é recomendada em ambientes de produção (assim como reiniciar a instância, serviços, servidor)  pois haverá impacto significativo na performance do SQL até que o cache se forme novamente na memória.

 

Para evitar perda de dados, vamos executar um CHECKPOINT antes. Quando o SQL vai alterar uma página de dados, uma cópia da página que está no disco é enviada para a memória e só então esta cópia é alterada (e continua na memória). Em determinados períodos o SQL faz um CHECKPOINT automático, gravando esta página alterada em disco, no lugar da página original. Portanto, vamos executar o CHECKPOINT para garantir que todas as páginas alteradas (também chamadas de dirty pages) serão gravadas em disco, antes de esvaziarmos o cache.

Imediatamente após o CHECKPOINT, fazemos a limpeza do cache em memória com o comando DBCC DROPCLEANBUFFERS (DROP CLEAN BUFFERS). A query fica assim:

 

USE AdventureWorks2008R2
GO
CHECKPOINT 
GO
DBCC DROPCLEANBUFFERS;
GO

 

O resultado é o da imagem abaixo:

 

 

Agora verifique o processo do SQL, já com a memória liberada para o Sistema Operacional.

 .

2 comentários

  1. Angelo Maximo

    Excelente Luiz, há alguns meses fiz um artigo na wiki aqui da empresa (que você conhece, já que também trabalhou aqui. #8D), para atender a demanda de um cliente, sobre como limpar o cache quando o número de paginas em memória está muito alto. Claro, como você citou, não deve ser executado em ambiente de produção, sem antes agendar com o cliente uma janela para tal atividade.
    Vou replicar seu artigo no meu blog.

  2. Luiz Mercante

    Fique à vontade meu caro, a ideia principal é realmente espalhar o conhecimento. Abraço!

Deixe uma resposta