¿Cómo se puede borrar todos los viejos planes de consulta desde Microsoft SQL Server?
-
16-10-2019 - |
Pregunta
Tenemos una aplicación de la plataforma que utiliza una base de datos Microsoft SQL. Dentro de esta aplicación escogemos varios criterios de selección para cada informe. Esta aplicación se ejecuta a continuación, estos informes.
Creo que tenemos un problema de plan de consulta. El primer informe se corre cada día, corre muy rápido 7 minutos. Cualquier informe se corre después del primer informe tarda más de una hora.
Cada noche que ejecutar una tarea programada que se detiene y se inicia el Agente SQL Server y SQL Server. Hay aproximadamente 25 otras bases de datos dentro de esta una instancia de SQL Server. No hay otras bases de datos tienen problemas de rendimiento, sólo el uno fuera de la plataforma de productos que he mencionado antes.
¿Hay una manera de limpiar todos los planes de consulta de SQL Server que tiene actualmente en la memoria?
¿Cómo puedo hacer esto sin afectar a 30 o para que los usuarios que dependen de otras bases de datos en el mismo servidor?
Solución
Mis disculpas por mi respuesta anterior.
1) Añadir la opción CON RECOMPILE a la sentencia CREATE PROCEDURE si usted sabe que la consulta variará cada vez que se ejecuta desde el procedimiento almacenado. Los opción evita CON recompilar el plan de reutilización de ejecución del procedimiento almacenado, por lo que SQL Server no almacena en caché un plan para este procedimiento y el procedimiento se vuelve a compilar en tiempo de ejecución. Con la opción WITH RECOMPILE puede mejorar el rendimiento si su consulta variará cada vez que se ejecuta desde el procedimiento almacenado ya que en este caso no se utilizará el plan de ejecución incorrecto.
2) Tienes que crear una guía de plan que utiliza un USO pista plan de consulta para cada tipo de consulta (cada procedimiento almacenado tipo de solicitud) a plan de ejecución de la fuerza.
Otros consejos
Se hizo dos preguntas aquí. En primer lugar, desea saber si se puede quitar todos los planes almacenados en la memoria para una instancia de SQL. Esto se hace con DBCC FREEPROCCACHE como se sugiere Matt M.
La segunda pregunta que se plantea es "¿Cómo puedo hacer esto sin afectar a 30 o para que los usuarios que dependen de otras bases de datos en el mismo servidor?". La respuesta corta es "no se puede". Si elimina todos los planes que los otros usuarios que están confiando en los planes que están en la memoria probablemente sufrirán un impacto en el rendimiento.
La solución para esto requiere una cierta intervención manual. Puede utilizar DBCC FREEPROCCACHE para eliminar planes específicos siempre que cuente con la plan_handle.
A partir de lo que usted está describiendo anterior suena como una cuestión de los planes, pero no estoy seguro de que la eliminación de los planes es la respuesta. Te gustaría apuntar en la dirección del descubrimiento de parámetros antes de pensar en la eliminación de los planes:
Debería ser capaz de optimizar las consultas en lugar de en torno a engañar con DBCC FREEPROCCACHE de forma programada. También aconsejaría que dedique tiempo a analizar los eventos de espera para la instancia.
Con este comando, puede borrar toda la caché de procedimientos abajo a un solo comando. Definitivamente leer la documentación antes de utilizar este comando. Lea las Notas de sección un par de veces.
Borrar la caché de procedimientos causará cachés de procedimientos almacenados para volver a compilar al siguiente uso. Esto podría afectar al rendimiento. Utilice con cuidado!
Matt