Tenemos una consulta particular de SQL Server 2008 (no un proceso almacenado, pero la misma cadena SQL, se ejecuta cada 5 minutos) que almacena en caché de forma intermitente un plan de consulta muy malo.
Esta consulta normalmente se ejecuta en unos pocos milisegundos, pero con este plan de consulta incorrecto, lleva más de 30 segundos.
¿Cómo elimino quirúrgicamente solo el plan de consulta en caché incorrecto de SQL Server 2008, sin eliminar toda la caché de consultas en el servidor de base de datos de producción?
sql-server
sql-server-2008
cache
query
Jeff Atwood
fuente
fuente
Respuestas:
Descubrí algunas cosas
mostrará todos los planes de consulta en caché. Desafortunadamente, no se muestra texto SQL allí.
Sin embargo, puede unir el texto SQL a los planes así:
Desde aquí es bastante trivial agregar una
WHERE
cláusula para encontrar el SQL que sé que está en la consulta, y luego puedo ejecutar:para eliminar cada plan de consulta de la caché del plan de consulta. No es exactamente fácil o conveniente, pero parece funcionar ...
editar: volcar todo el caché de consultas también funcionará, y es menos peligroso de lo que parece, al menos en mi experiencia:
fuente
Si sabe cómo se ve el buen plan, simplemente use una sugerencia de plan .
No puede eliminar una entrada de caché específica, pero puede limpiar un grupo de caché completo con
DBCC FREESYSTEMCACHE(cachename/poolname)
.Puede obtener el nombre de caché de un plan de consulta incorrecto si tiene el identificador del plan (de sys.dm_exec_requests.plan_handle para el session_id en problemas durante la ejecución, o de sys.dm_exec_query_stats después de la ejecución):
Sin embargo, todos los planes SQL tienen el nombre 'Planes SQL', lo que hace que elegir el adecuado para DBCC FREESYSTEMCACHE sea una ... elección difícil.
Actualizar
No importa, se olvidó
DBCC FREEPROCCACHE(plan_handle)
, sí, eso funcionará.fuente
sys.dm_exec_cached_plans
no tiene entrada para elplan_handle
desdesys.dm_exec_requests
?La solución FREEPROCCACHE está bien, pero una forma más directa de hacerlo es usar OPTION (RECOMPILE) en su cadena SQL (usted mencionó que no era un SP), esto le dice al motor que es un plan de uso único, porque probablemente sospeche hay un olfateo de parámetros o sus estadísticas son drásticamente diferentes de una ejecución a otra y sospecha que es un problema de plan en caché incorrecto.
fuente