Share via


Volver a compilar procedimientos almacenados

Cuando se cambia una base de datos mediante la adición de índices o la modificación de datos de columnas indizadas, los planes de consulta originales utilizados para el acceso a las tablas deberán optimizarse de nuevo; para ello, será preciso volver a compilarlos. Esta optimización se produce automáticamente la primera vez que se ejecuta un procedimiento almacenado tras reiniciar MicrosoftSQL Server. También se produce si cambia una tabla subyacente utilizada por el procedimiento almacenado. Pero si se agrega un nuevo índice del que se puede beneficiar el procedimiento almacenado, la optimización no se produce hasta que se vuelve a ejecutar el procedimiento almacenado tras reiniciar SQL Server. En esta situación, puede ser útil forzar que se vuelva a compilar el procedimiento almacenado la próxima vez que se ejecute.

Otro motivo para forzar que se vuelva a compilar un procedimiento almacenado es contrarrestar, cuando sea necesario, el comportamiento de "examen de parámetros" de la compilación de procedimientos almacenados. Cuando SQL Server ejecuta procedimientos almacenados, los valores de parámetros utilizados por el procedimiento cuando se compila se incluyen como parte de la generación del plan de consultas. Si esos valores representan los valores típicos con los que el procedimiento se invoca posteriormente, el procedimiento almacenado se beneficia del plan de consultas cada vez que se compila y se ejecuta. En caso contrario, el rendimiento puede verse afectado.

[!NOTA]

SQL Server 2008 incorpora recompilación de instrucciones individuales de los procedimientos almacenados. Cuando SQL Server 2008 recompila procedimientos almacenados, sólo se compila la instrucción que ha causado la recompilación, en lugar del procedimiento completo. En consecuencia, SQL Server utiliza los valores de parámetros como existen en la instrucción recompilada al volver a generar un plan de consultas. Esos valores pueden diferir de los que se pasaron originalmente al procedimiento.

Forzar la recompilación de un procedimiento almacenado

SQL Server proporciona tres formas de forzar que un procedimiento almacenado se vuelva a compilar:

  • El procedimiento almacenado del sistema sp_recompile fuerza que se vuelva a compilar un procedimiento almacenado cuando se vuelva a ejecutar. Para ello, elimina el plan existente de la memoria caché de procedimientos que fuerza la creación de un nuevo plan cuando el procedimiento se vuelve a ejecutar.

  • La creación de un procedimiento almacenado que especifique la opción WITH RECOMPILE en su definición indica a SQL Server que no guarde en memoria caché ningún plan para ese procedimiento almacenado, que vuelve a compilarse cada vez que se ejecuta. Utilice la opción WITH RECOMPILE cuando los procedimientos almacenados adopten parámetros cuyos valores varíen considerablemente entre distintas ejecuciones del procedimiento almacenado y produzcan la creación de distintos planes de ejecución cada vez. Esta opción no se utiliza con mucha frecuencia y provoca que el procedimiento almacenado se ejecute más lentamente, ya que debe compilarse de nuevo cada vez que se ejecuta.

    Si solo desea que se vuelvan a compilar consultas individuales dentro del procedimiento almacenado, en lugar de la totalidad del procedimiento almacenado, especifique la sugerencia de consulta RECOMPILE dentro de cada consulta que desee volver a compilar. Este comportamiento imita el comportamiento de la recompilación de nivel de instrucción de SQL Server expuesto anteriormente, pero además de utilizar los valores de parámetro actuales del procedimiento almacenado, la sugerencia de consulta de RECOMPILE también utiliza los valores de las variables locales de dentro del procedimiento almacenado durante la compilación de la instrucción. Utilice esta opción cuando se utilicen valores atípicos o temporales sólo en un subconjunto de consultas que pertenecen al procedimiento almacenado. Para obtener más información, vea Sugerencia de consulta (Transact-SQL).

  • Puede forzar que se vuelva a compilar el procedimiento almacenado si especifica la opción WITH RECOMPILE al ejecutarlo. Utilice esta opción únicamente si el parámetro que está suministrando es atípico o si los datos han cambiado considerablemente desde que se creó el procedimiento almacenado.

    [!NOTA]

    Si se elimina o se cambia el nombre de un objeto al que se hace referencia desde un procedimiento, se devuelve un error durante la ejecución del procedimiento almacenado. No obstante, si un objeto al que se hace referencia en un procedimiento almacenado se reemplaza por otro objeto con el mismo nombre, el procedimiento almacenado se ejecuta sin necesidad de que se vuelva a crear.

Para volver a compilar un procedimiento almacenado cuando se ejecuta de nuevo