Como posso limpar o cache de consulta do SQL Server?

199

Eu tenho uma consulta simples em execução no SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

A primeira vez que executo a consulta pode demorar > 15 secs. Execuções subseqüentes estão de volta < 1 sec.

Como faço para o SQL Server 2005 não usar resultados em cache? Eu tentei correr

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Mas isso parece não ter efeito na velocidade da consulta (ainda < 1 sec).

PaulB
fonte
DUPLICATE: stackoverflow.com/questions/1856966/… mas melhor
Faiz

Respostas:

259

Aqui está uma boa explicação. confira.

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Do artigo vinculado:

Se todo o teste de desempenho for realizado no SQL Server, a melhor abordagem pode ser emitir um CHECKPOINT e, em seguida, emitir o comando DBCC DROPCLEANBUFFERS. Embora o processo CHECKPOINT seja um processo interno automático do sistema no SQL Server e ocorra regularmente, é importante emitir este comando para gravar todas as páginas sujas do banco de dados atual em disco e limpar os buffers. Em seguida, o comando DBCC DROPCLEANBUFFERS pode ser executado para remover todos os buffers do buffer pool.

Saar
fonte
14
Um maight também incluem DBCC FREEPROCCACHE
jaraics
1
Ao usar dropcleanbuffers, é para todos que estão conectados ao banco de dados ou apenas para esse usuário?
Kris Nobels
1
@Kris: DBCC DROPCLEANBUFFERS, remove todos os buffers limpos do buffer pool. Esta é a etapa necessária no ajuste do desempenho da consulta e não se deve usá-lo no SQL Server ativo.
Saar
Isso funciona bem para o SQL Server, mas observe que isso não funciona no SQL Azure - publiquei uma solução alternativa abaixo para lidar com o cenário do SQL Azure.
MSC
1
Bom, este é o único comando que realmente funciona, tentou muitos outros e não funcionou.
Gabriel Rodriguez
15

Oito maneiras diferentes de limpar o cache do plano

1. Remova todos os elementos do cache do plano para toda a instância

DBCC FREEPROCCACHE;

Use isso para limpar o cache do plano com cuidado. A liberação do cache do plano faz com que, por exemplo, um procedimento armazenado seja recompilado em vez de reutilizado a partir do cache. Isso pode causar uma diminuição repentina e temporária no desempenho da consulta.

2. Limpe o cache do plano para toda a instância e suprima a mensagem de conclusão regular

"Execução do DBCC concluída. Se o DBCC imprimiu mensagens de erro, entre em contato com o administrador do sistema."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Limpe o cache do plano ad hoc e preparado para toda a instância

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Limpe o cache do plano ad hoc e preparado para um pool de recursos

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');

5. Limpe todo o cache do plano para um pool de recursos

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Remova todos os elementos do cache do plano para um banco de dados (não funciona no SQL Azure)

-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid] 
                FROM master.dbo.sysdatabases 
                WHERE name = N'AdventureWorks2014');

DBCC FLUSHPROCINDB (@intDBID);

7. Limpe o cache do plano para o banco de dados atual

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

8. Remova um plano de consulta do cache

USE AdventureWorks2014;
GO

-- Run a stored procedure or query
EXEC dbo.uspGetEmployeeManagers 9;

-- Find the plan handle for that query 
-- OPTION (RECOMPILE) keeps this query from going into the plan cache
SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
DB_NAME(st.dbid) AS [DatabaseName]
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
WHERE OBJECT_NAME (st.objectid)
LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 

-- Remove the specific query plan from the cache using the plan handle from the above query 
DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
 

Fonte 1 2 3

Somnath Muluk
fonte
9

Embora a questão seja um pouco antiga, isso ainda pode ajudar. Estou com problemas semelhantes e o uso da opção abaixo me ajudou. Não tenho certeza se essa é uma solução permanente, mas está corrigindo-a por enquanto.

OPTION (OPTIMIZE FOR UNKNOWN)

Então sua consulta será assim

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Tony Basallo
fonte
1
Sintaxe incorreta perto da palavra-chave 'OPÇÃO'. ou Sintaxe incorreta perto de 'DESCONHECIDO'.
Pabrams
1
@pabrams Eles vão depois (como parte de) da sua consulta da seguinte maneira:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius
1
Apenas garanta ABSOLUTAMENTE que você não insira inadvertidamente algo assim no código de PRODUÇÃO - pois isso pode causar problemas MAIORES no futuro.
Michael K. Campbell
4
OTIMIZAR PARA DESCONHECIDO não ignora os planos em cache. Em vez disso, ao gerar um plano, ele instrui o SQL Server a escolher "valores médios de distribuição, independentemente de qualquer parametrização [automática]" para decidir qual plano criar - isso resulta em planos que podem ser mais consistentes em estatísticas não uniformes. Uma OPTION (RECOMPILE) cria um novo plano, mas não limpa / libera o cache de dados - isso geralmente gera planos mais ideais às custas da regeneração do plano e dos custos de cache do plano.
user2864740
6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

O valor que você especifica para a memória do servidor não é importante, desde que seja diferente do atual.

Aliás, o que causa a aceleração não é o cache de consulta, mas o cache de dados.

erikkallen
fonte
3

Note que nem DBCC DROPCLEANBUFFERS; nem DBCC FREEPROCCACHE;há suporte no SQL Azure / SQL Data Warehouse.

No entanto, se você precisar redefinir o cache do plano no SQL Azure, poderá alterar uma das tabelas da consulta (por exemplo, basta adicionar e remover uma coluna); isso terá o efeito colateral de remover o plano do cache .

Pessoalmente, faço isso como uma maneira de testar o desempenho da consulta sem precisar lidar com planos em cache.

Mais detalhes sobre o cache de procedimentos do SQL Azure aqui

MSC
fonte
Isso não funcionou para mim, então o plano não foi alterado. Veja aqui stackoverflow.com/questions/46987785/…
Meneghino