SQL Server: Cómo borrar un plan de ejecución específico de la caché

Oh!!! que caprichosa la performance de las consultas cuando una base de datos es bien grande!!!

La mayor aventura que yo viví fue cuando migramos la base de datos de SQL SERVER 2008 a SQL SERVER 2014 2014, que maravilla… si hasta encontramos issues y se las mandamos a la propia Microsoft.

Consultas que habían funcionado toda la vida, ahora tardaban siglos en ejecutarse.

Cuando uno se asomaba a la estimación que se hacía para el plan de ejecución se quedaba estupefacto al ver que joins que esperaban 1 fila recibían miles de ellas.

Pero uno de los errores más jodidos de arreglar que tuvimos fue el de una query en producción que tenia un plan de ejecución antiguo y que no quería usar el nuevo porque no le salía de las entretelas.

Básicamente el plan de ejecución estaba cacheado en el servidor de producción.

Y cómo borramos el plan para esa query de la caché sin cargarnos todos los planes de la caché?

Pues un usuario medio quizás te hubiera dicho: dbcc freeproccache

pero ojo! porque esto borra tooooda la cache! la deja muy limpica!

Lo suyo es encontrar el plan de esa consulta en particular, para ello podemos ejecutar la siguiente consulta SQL:

SELECT  a.*,c.text,’DBCC FREEPROCCACHE (‘ ,plan_handle  , ‘)’

FROM sys.dm_exec_cached_plans A

CROSS APPLY sys.dm_exec_sql_text(A.Plan_handle) c

where c.text like ‘(%aquí el texto o parte del mismo de la consulta cacheada%’

Esto nos va a devolver una o varias rows con los diferentes planes que esa consulta tiene cacheada

Con el identificador del plan cacheado (0x0…00…) podemos usar

Esta query para borrar

DBCC FREEPROCCACHE (0x06002C0007979E25F0BE314B0600000001000000000000000000000000000000000000000000000000000000) — deletes cache

Y esta query para consultar,

Truco: El xml que nos devuelve se puede abrir con SQL Server haciendo doble click y en el podremos ver el execution plan de forma gráfica:

2_Extracting_the_Execution_Plan_from_SQL_Server_Plan_Cache

select * from sys.dm_exec_query_plan(0x06002C0079B33C36A0287B227000000001000000000000000000000000000000000000000000000000000000) b — retrieves query plan from cache

 

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada.