DBCC FREEPROCCACHE
no funciona en Azure SQL DB. ¿De qué otra manera puedo forzar un plan para que salga del caché de una manera que no perjudique a un sistema de producción (es decir, no puedo simplemente alterar las tablas de todas formas)? Esto es específicamente para SQL creado por Entity Framework, por lo que estos no son procesos almacenados autogestionados, es efectivamente SQL dinámico.
(La fuente era índices malos -> estadísticas malas, etc. Eso está todo arreglado, pero un mal plan no desaparecerá).
ACTUALIZACIÓN: Seleccioné la solución de @ mrdenny cuando llegó allí primero. Sin embargo, estoy usando con éxito el script de @Aaron Bertrand para realizar el trabajo. ¡Gracias a todos por la ayuda!
sql-server
execution-plan
azure-sql-database
Jaxidian
fuente
fuente
sp_executesql
.Respuestas:
Azure SQL ahora admite directamente esto
Azure SQL Database admite directamente la eliminación de la caché de proceso de la base de datos del usuario actual sin ningún tipo de piratería:
Información Adicional
El siguiente script (de Shannon Gowen ) se puede usar para ver el proceso paso a paso:
fuente
No hay una forma explícita de hacer esto hoy, pero ese no es un escenario permanente (el comando DBCC todavía no es compatible, pero se lee en el Almacén de consultas ). Incluso cuando el golpe de cambio de esquema es aceptable, puede que no sea lo que desea, porque invalidará todos los planes relacionados con el objeto subyacente, no solo el malo.
No busco crédito para esto, pero construir SQL dinámico para realizar la misma operación en varias tablas es bastante fácil:
(Escribí un consejo sobre este problema de "longitud de SQL dinámico" ...)
fuente
nvarchar(max)
variable alcanza un límite después de 4000 caracteres, 8000 caracteres si lo cambio avarchar(max)
. Ejecutando ese script exacto. Tenemos ~ 450 mesas, por lo que acertamos fácilmente (~ 30/60 tablas).varchar(max)
es una sintaxis válida, es idénticavarchar(8000)
ynvarchar(max)
idéntica anvarchar(4000)
.PRINT
el comando, solo muestra 8000 bytes. Esa es una limitación delPRINT
comando, no Azure. Si ejecuta el comando, funcionará incluso si no puede inspeccionar visualmente todo.Agregue una columna anulable a la tabla y luego suelte la columna. Eso obligará a SQL a vaciar el caché para ese objeto.
En cuanto a hacer todas las tablas, un cursor debería hacer el truco. Simplemente use un nombre de columna que nunca existirá en ninguna tabla como 'zzzzzz_go_away' o algo así.
fuente
Azure SQL Database actualmente no es compatible
DBCC FREEPROCCACHE
, por lo que no puede eliminar manualmente un plan de ejecución del caché. Sin embargo, si realiza cambios en una tabla o vista a la que hace referencia la consulta (ALTER TABLE
/ALTER VIEW
), el plan se eliminará de la memoria caché. ( Referencia )fuente
Para borrar todo el plan de ejecución, use esto:
Si modifica una tabla o una vista que hace referencia a ella, el plan de ejecución se borra.
Un poco más explicado aquí http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-from-the-procedure-cache-in-sql-azure/
fuente