¿Cómo puedo borrar el caché de consultas de SQL Server?

199

Tengo una consulta simple ejecutándose contra SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

La primera vez que ejecuto la consulta puede tomar > 15 secs . Las ejecuciones posteriores vuelven a entrar < 1 sec.

¿Cómo puedo hacer que SQL Server 2005 no use ningún resultado en caché? He intentado correr

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Pero esto parece no tener ningún efecto en la velocidad de la consulta (aún < 1 sec).

PaulB
fuente
DUPLICAR: stackoverflow.com/questions/1856966/… pero mejor
Faiz

Respuestas:

259

Aquí hay una buena explicación. échale un vistazo.

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Del artículo vinculado:

Si todas las pruebas de rendimiento se realizan en SQL Server, el mejor enfoque puede ser emitir un PUNTO DE CONTROL y luego emitir el comando DBCC DROPCLEANBUFFERS. Aunque el proceso CHECKPOINT es un proceso interno automático del sistema en SQL Server y ocurre de manera regular, es importante emitir este comando para escribir todas las páginas sucias de la base de datos actual en el disco y limpiar los buffers. Luego, el comando DBCC DROPCLEANBUFFERS se puede ejecutar para eliminar todos los búferes del grupo de búferes.

Sarre
fuente
14
Un maight también incluye DBCC FREEPROCCACHE
jaraics
1
Al usar dropcleanbuffers, ¿esto es para todos los que están conectados a la base de datos o solo para ese usuario?
Kris Nobels
1
@Kris: DBCC DROPCLEANBUFFERS, elimina todos los búferes limpios del grupo de búferes. Este es un paso necesario en el ajuste del rendimiento de la consulta y no se debe usar en SQL Server en vivo.
Saar
Esto funciona bien para SQL Server, pero tenga en cuenta que esto no funciona en SQL Azure: he publicado una solución alternativa a continuación para manejar el escenario SQL Azure.
MSC
1
Bien, este es el único comando que realmente funciona, probé muchos otros y no funcionó.
Gabriel Rodriguez
15

Ocho formas diferentes de borrar el caché del plan

1. Elimine todos los elementos de la caché del plan para toda la instancia

DBCC FREEPROCCACHE;

Use esto para borrar el caché del plan con cuidado. La liberación de la memoria caché del plan hace que, por ejemplo, se recompile un procedimiento almacenado en lugar de reutilizarse desde la memoria caché. Esto puede causar una disminución repentina y temporal en el rendimiento de la consulta.

2. Vacíe el caché del plan para toda la instancia y suprima el mensaje de finalización regular

"Ejecución de DBCC completada. Si DBCC imprimió mensajes de error, comuníquese con el administrador del sistema".

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Vacíe el caché del plan ad hoc y preparado para toda la instancia

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Vacíe el caché del plan ad hoc y preparado para un grupo de recursos

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

5. Vacíe todo el caché del plan para un grupo de recursos

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Elimine todos los elementos de la caché del plan para una base de datos (no funciona en 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. Borrar el caché del plan para la base de datos actual

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

8. Eliminar un plan de consulta del caché

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);
 

Fuente 1 2 3

Somnath Muluk
fuente
9

Si bien la pregunta es un poco antigua, esto podría ayudar. Me encuentro con problemas similares y usar la opción a continuación me ha ayudado. No estoy seguro de si esta es una solución permanente, pero la está arreglando por ahora.

OPTION (OPTIMIZE FOR UNKNOWN)

Entonces su consulta será así

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Tony Basallo
fuente
1
Sintaxis incorrecta cerca de la palabra clave 'OPCIÓN'. o Sintaxis incorrecta cerca de 'DESCONOCIDO'.
pabrams
1
@pabrams Estos van después (como parte de) su consulta así:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius
1
Solo asegúrese ABSOLUTAMENTE de no dejar caer algo así sin darse cuenta en código de PRODUCCIÓN, ya que eso podría causar problemas MAYORES en el futuro.
Michael K. Campbell
44
OPTIMIZAR PARA DESCONOCIDO no ignora los planes en caché. Por el contrario, al generar un plan, le indica al servidor SQL que elija "valores de distribución promedio, independientemente de cualquier parametrización [automática]" para decidir qué plan crear: esto da como resultado planes que pueden ser más consistentes en las estadísticas no uniformes. Una OPCIÓN (RECOMPILAR) crea un nuevo plan, pero de otro modo no limpia / libera el caché de datos; esto generalmente genera planes más ideales a expensas de la regeneración del plan y los costos de almacenamiento en caché del plan.
user2864740
6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

El valor que especifique para la memoria del servidor no es importante, siempre que difiera del actual.

Por cierto, lo que causa la aceleración no es el caché de consultas, sino el caché de datos.

erikkallen
fuente
3

Tenga en cuenta que ni DBCC DROPCLEANBUFFERS;niDBCC FREEPROCCACHE; es compatible con SQL Azure / SQL Data Warehouse.

Sin embargo, si necesita restablecer la caché del plan en SQL Azure, puede modificar una de las tablas de la consulta (por ejemplo, simplemente agregue y elimine una columna), esto tendrá el efecto secundario de eliminar el plan de la caché .

Personalmente, hago esto como una forma de probar el rendimiento de las consultas sin tener que lidiar con los planes en caché.

Más detalles sobre la caché de procedimientos de SQL Azure aquí

MSC
fuente
Esto no funcionó para mí, entonces el plan no cambió. Vea aquí stackoverflow.com/questions/46987785/…
Meneghino