sql >> Base de Datos >  >> RDS >> Sqlserver

¿Qué factores pueden causar la Recompilación de procedimientos almacenados en SQL Server?

Hay algunas formas de garantizar la recompilación de un procedimiento almacenado:

  • usando WITH RECOMPILE ,
  • hacer que el procedimiento almacenado sea dinámico (piense en exec() )
  • marcando el proceso para recompilar con sp_recompile .
  • cambiar el esquema en el que se basa un plan de consulta en caché
  • llamando a DBCC FREEPROCCACHE
  • En el nivel de consulta, una declaración individual dentro de un proceso se puede volver a compilar con la sugerencia de consulta RECOMPILE (SQL 2008).

Factores en la Recompilación

Además de los factores difíciles enumerados anteriormente, ¿qué causa la recompilación de procedimientos almacenados? Bueno, muchas cosas. Algunos de estos están entretejidos con la lista anterior, pero quiero volver a presentarlos porque puede que no sea obvio.

  • Insertar o eliminar muchos datos (la densidad de datos en índices y tablas a menudo controla los planes de consulta)
  • Reconstrucción de índices (un cambio en los objetos subyacentes)
  • Crear/descartar tablas temporales (nuevamente, cambios DML subyacentes).
  • el plan de consulta vence (piense que no se usó recientemente y sql quiere limpiar el uso de la memoria)

Esta no es una lista exhaustiva. El optimizador de consultas evoluciona y sorprende sin importar cuánto tiempo haya estado usando SQL Server. Pero aquí hay algunos recursos que pueden ser útiles:

PERO ESPERA - ¡HAY MÁS!

Dicho esto, la presunción en su pregunta es que las recompilaciones siempre son malas para el rendimiento. De hecho, a menudo la recompilación es buena.

Entonces, ¿cuándo quieres que se vuelva a compilar? Veamos un ejemplo de un proceso que busca por apellido. Los procedimientos almacenados hacen 'parameter sniffing ' que es una bendición (si funciona para ti) y una maldición (si funciona en tu contra). Primero pasa que alguien busca en Zebr% para zerbrowski. El índice de apellidos se da cuenta de que esto es muy específico y devolverá, digamos, 3 filas de un millón, por lo que se construye un plan de ejecución. Con el proceso compilado para un resultado de fila bajo, la siguiente búsqueda es S% . Bueno, S es su nombre más común y coincide con 93 543 filas de 1 millón.