Come posso cancellare la cache delle query di SQL Server?


199

Ho una semplice query in esecuzione su SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

La prima volta che eseguo la query può richiedere > 15 secs. Le esecuzioni successive sono tornate < 1 sec.

Come posso ottenere SQL Server 2005 per non utilizzare alcun risultato memorizzato nella cache? Ho provato a correre

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Ma questo sembra non avere alcun effetto sulla velocità della query (ancora < 1 sec).


Risposte:


259

Ecco qualche buona spiegazione. dai un'occhiata.

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Dall'articolo collegato:

Se tutti i test delle prestazioni vengono eseguiti in SQL Server, l'approccio migliore potrebbe essere quello di emettere un CHECKPOINT e quindi emettere il comando DBCC DROPCLEANBUFFERS. Sebbene il processo CHECKPOINT sia un processo di sistema interno automatico in SQL Server e si verifichi su base regolare, è importante emettere questo comando per scrivere tutte le pagine sporche per il database corrente su disco e pulire i buffer. Quindi è possibile eseguire il comando DBCC DROPCLEANBUFFERS per rimuovere tutti i buffer dal pool di buffer.


14
Uno potrebbe anche includere DBCC FREEPROCCACHE
jaraics,

1
Quando si usano dropcleanbuffers questo è per tutti coloro che sono connessi al database o solo per quell'utente?
Kris Nobels,

1
@Kris: DBCC DROPCLEANBUFFERS, rimuove tutti i buffer puliti dal pool di buffer. Questo è un passaggio necessario nell'ottimizzazione delle prestazioni delle query e non si dovrebbe usarlo su SQL Server live.
Saar,

Funziona bene con SQL Server, ma tieni presente che non funziona in SQL Azure: di seguito ho pubblicato una soluzione alternativa per gestire lo scenario di SQL Azure.
MSC

1
Bene, questo è l'unico comando che funziona davvero, ne ha provati molti altri e non ha funzionato.
Gabriel Rodriguez,

15

Otto diversi modi per cancellare la cache del piano

1. Rimuovere tutti gli elementi dalla cache del piano per l'intera istanza

DBCC FREEPROCCACHE;

Utilizzare questo per cancellare attentamente la cache del piano. La liberazione della cache del piano provoca, ad esempio, la ricompilazione di una procedura memorizzata anziché il riutilizzo dalla cache. Ciò può causare una riduzione improvvisa e temporanea delle prestazioni della query.

2. Svuotare la cache del piano per l'intera istanza e sopprimere il normale messaggio di completamento

"Esecuzione DBCC completata. Se DBCC ha stampato messaggi di errore, contattare l'amministratore di sistema."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Svuota la cache del piano ad hoc e preparata per l'intera istanza

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Svuotare la cache del piano ad hoc e preparata per un pool di risorse

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

5. Svuota l'intera cache del piano per un pool di risorse

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Rimuovere tutti gli elementi dalla cache del piano per un database (non funziona in 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. Cancella la cache del piano per il database corrente

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

8. Rimuovere un piano di query dalla 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


9

Mentre la domanda è solo un po 'vecchia, questo potrebbe ancora aiutare. Sto riscontrando problemi simili e l'utilizzo dell'opzione di seguito mi ha aiutato. Non sono sicuro che si tratti di una soluzione permanente, ma per ora lo sta risolvendo.

OPTION (OPTIMIZE FOR UNKNOWN)

Quindi la tua query sarà così

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)

1
Sintassi errata vicino alla parola chiave "OPTION". o Sintassi errata vicino a "SCONOSCIUTO".
pabrams,

1
@pabrams Seguono (come parte di) la tua domanda in questo modo:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius,

1
Assicurati ASSOLUTAMENTE di non inserire inavvertitamente qualcosa del genere nel codice PRODUCTION, perché ciò potrebbe causare problemi MAJOR lungo la strada.
Michael K. Campbell,

4
OTTIMIZZA PER SCONOSCIUTO non ignora i piani memorizzati nella cache. Piuttosto, quando genera un piano indica a SQL server di scegliere "valori di distribuzione medi, indipendentemente da qualsiasi parametrizzazione [automatica]" per decidere quale piano creare - questo porta a piani che possono essere più coerenti tra statistiche non uniformi. Un'OPZIONE (RECOMPILE) crea un nuovo piano, ma non pulisce / rilascia altrimenti la cache di dati - questo di solito genera piani più ideali a spese della rigenerazione del piano e dei costi di memorizzazione nella cache del piano.
user2864740

6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

Il valore specificato per la memoria del server non è importante, a condizione che differisca da quello corrente.

A proposito, ciò che provoca l'accelerazione non è la cache delle query, ma la cache dei dati.


3

Si noti che né DBCC DROPCLEANBUFFERS;DBCC FREEPROCCACHE;è supportato in SQL Azure / SQL Data Warehouse.

Tuttavia, se è necessario ripristinare la cache del piano in SQL Azure, è possibile modificare una delle tabelle nella query (ad esempio, basta aggiungere quindi rimuovere una colonna), ciò avrà l'effetto collaterale di rimuovere il piano dalla cache .

Personalmente lo faccio come un modo per testare le prestazioni delle query senza dover gestire i piani memorizzati nella cache.

Maggiori dettagli su SQL Azure Procedure Cache qui


Questo non ha funzionato per me, quindi il piano è rimasto invariato. Si prega di consultare qui stackoverflow.com/questions/46987785/…
Meneghino,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.