Saltar al contenido

¿Cómo borrar consultas ad hoc del caché del plan?

Este team de redactores ha estado horas buscando para darle solución a tus dudas, te compartimos la solución por eso deseamos que te sea de mucha ayuda.

Solución:

Entonces, solo desea borrar los planes de consulta Ad-hoc y aún no desea borrar todo el caché del procedimiento. Lo que está preguntando está en Borrar sus planes de SQL ad-hoc mientras mantiene intactos sus planes de SP

El blog te pide que corras

DBCC FREESYSTEMCACHE('SQL Plans')

Según el blog

La caché de procedimientos en realidad consta de 4 almacenes de caché distintos que contienen diferentes tipos de planes. Esos almacenes de caché son:

  • CACHESTORE_OBJCP: estos son “Planes de objetos”: procedimientos almacenados, funciones y disparadores. En general, las cosas buenas.
  • CACHESTORE_SQLCP: estos son “Planes SQL”: declaraciones SQL ad-hoc (incluidas las parametrizadas) y declaraciones preparadas. Esto es lo que buscamos.
  • CACHESTORE_PHDR: los llamados “árboles enlazados” para vistas, restricciones y valores predeterminados. Irrelevante para el problema discutido.
  • CACHESTORE_XPROC: no son realmente planes de ejecución, sino indicadores de los puntos de entrada de sus SP ampliados.

para que puedas ver selectivamente borrar el SQLCP eliminaría los planes preparados y ad-hoc. Probé esto en mi sistema.

Ejecutó consulta

select objtype, 
count(*) as number_of_plans, 
sum(cast(size_in_bytes as bigint))/1024/1024 as size_in_MBs,
avg(usecounts) as avg_use_count
from sys.dm_exec_cached_plans
--where objtype='adhoc'
group by objtype

Y la salida fue

ingrese la descripción de la imagen aquí

Puedes ver la imagen tiene 1264 planes ad-hoc y 69 declaraciones preparadas.

Ahora borro selectivamente el SQLCP usando DBCC FREESYSTEMCACHE('SQL Plans') y vuelva a ejecutar la consulta nuevamente, lo que me dio el siguiente resultado

ingrese la descripción de la imagen aquí

Ahora puedes ver que los planes ad-hoc y preparados son 2 y 6 respectivamente. Mientras que otros NO se ven afectados.

DECLARE @plan_handle varbinary(64)

DECLARE db_cursor CURSOR FOR 
SELECT plan_handle
FROM sys.dm_exec_cached_plans
WHERE objtype = 'Adhoc' -- and usecounts = 1 -- optional: just delete the ones that are used only once

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @plan_handle  

WHILE @@FETCH_STATUS = 0  
BEGIN  
    DBCC FREEPROCCACHE (@plan_handle);  
    FETCH NEXT FROM db_cursor INTO @plan_handle 
END 

CLOSE db_cursor  
DEALLOCATE db_cursor 

Sección de Reseñas y Valoraciones

Puedes añadir valor a nuestra información añadiendo tu experiencia en los informes.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *