Compartir a través de


Volver a compilar un procedimiento almacenado

En este tema se describe cómo volver a compilar un procedimiento almacenado en SQL Server 2014 mediante Transact-SQL. Hay tres maneras de hacerlo: WITH RECOMPILE opción en la definición del procedimiento o cuando se llama al procedimiento, el RECOMPILE indicador de consulta en sentencias individuales o mediante el procedimiento almacenado del sp_recompile sistema. En este tema se describe el uso de la opción WITH RECOMPILE al crear una definición de procedimiento y ejecutar un procedimiento existente. También se describe el uso del procedimiento almacenado del sistema sp_recompile para volver a compilar un procedimiento existente.

En este tema

Antes de empezar

Recomendaciones

  • Cuando se compila un procedimiento por primera vez o se vuelve a compilar, el plan de consulta del procedimiento se optimiza para el estado actual de la base de datos y sus objetos. Si una base de datos sufre cambios significativos en sus datos o estructura, la recompilación de un procedimiento actualiza y optimiza el plan de consulta del procedimiento para esos cambios. Esto puede mejorar el rendimiento del procesamiento del procedimiento.

  • Hay ocasiones en las que la recompilación de procedimientos debe ser forzada y otras veces cuando se produce automáticamente. La recompilación automática se produce cada vez que se reinicia SQL Server. También se produce si una tabla subyacente a la que hace referencia el procedimiento ha sufrido cambios de diseño físico.

  • Otra razón para forzar la recompilación de un procedimiento es contrarrestar el comportamiento de "examen de parámetros" de la compilación de procedimientos. Cuando SQL Server ejecuta procedimientos, los valores de parámetro que usa el procedimiento cuando se compila se incluyen como parte de la generación del plan de consulta. Si estos valores representan los típicos con los que se llama al procedimiento posteriormente, el procedimiento se beneficia del plan de consulta cada vez que es compilado y ejecutado. Si los valores de parámetro del procedimiento suelen ser inusuales, forzar una recompilación del procedimiento y un nuevo plan basado en valores de parámetros diferentes puede mejorar el rendimiento.

  • SQL Server incluye la recompilación a nivel de sentencia de los procedimientos. Cuando SQL Server vuelve a compilar procedimientos almacenados, solo se compila la instrucción que provocó la recompilación, en lugar del procedimiento completo.

  • Si ciertas consultas de un procedimiento usan regularmente valores temporales o inusuales, el rendimiento del procedimiento se puede mejorar mediante la sugerencia de consulta RECOMPILE dentro de esas consultas. Dado que solo las consultas que usan la sugerencia de consulta se volverán a compilar en lugar del procedimiento completo, se imita el comportamiento de recompilación de nivel de instrucción de SQL Server. Además de utilizar los valores actuales de los parámetros del procedimiento, la sugerencia de consulta RECOMPILE también utiliza los valores de cualquier variable local dentro del procedimiento almacenado cuando se compila la instrucción. Para obtener más información, vea Sugerencia de consulta (Transact-SQL).

Seguridad

Permisos

WITH RECOMPILE Opción
Si se usa esta opción cuando se crea la definición del procedimiento, requiere el permiso CREATE PROCEDURE en la base de datos y el permiso ALTER en el esquema en el que se crea el procedimiento.

Si esta opción se utiliza en una instrucción EXECUTE, requiere permisos de ejecución en el procedimiento. Los permisos no son necesarios en la propia instrucción EXECUTE, pero los permisos de ejecución son necesarios en el procedimiento al que se hace referencia en la instrucción EXECUTE. Para obtener más información, vea EXECUTE (Transact-SQL).

RECOMPILE Sugerencia de consulta
Esta característica se usa cuando se crea el procedimiento y la sugerencia se incluye en instrucciones Transact-SQL en el procedimiento. Por lo tanto, requiere el permiso CREATE PROCEDURE en la base de datos y el permiso ALTER en el esquema en el que se está creando el procedimiento.

sp_recompile Procedimiento almacenado del sistema
Requiere el permiso ALTER en el procedimiento especificado.

Uso de Transact-SQL

Para volver a compilar un procedimiento almacenado mediante la opción WITH RECOMPILE

  1. Conéctese al motor de base de datos.

  2. En la barra Estándar, haga clic en Nueva consulta.

  3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic en Ejecutar. En este ejemplo se crea la definición del procedimiento.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL   
    DROP PROCEDURE dbo.uspProductByVendor;  
GO  
CREATE PROCEDURE dbo.uspProductByVendor @Name varchar(30) = '%'  
WITH RECOMPILE  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS 'Vendor name', p.Name AS 'Product name'  
    FROM Purchasing.Vendor AS v   
    JOIN Purchasing.ProductVendor AS pv   
      ON v.BusinessEntityID = pv.BusinessEntityID   
    JOIN Production.Product AS p   
      ON pv.ProductID = p.ProductID  
    WHERE v.Name LIKE @Name;  
  

Para volver a compilar un procedimiento almacenado mediante la opción WITH RECOMPILE

  1. Conéctese al motor de base de datos.

  2. En la barra Estándar, haga clic en Nueva consulta.

  3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic en Ejecutar. En este ejemplo se crea un procedimiento sencillo que devuelve todos los empleados, con nombres y apellidos incluidos, sus puestos de trabajo y los nombres de sus departamentos a partir de una vista.

    A continuación, copie y pegue el segundo ejemplo de código en la ventana de consulta y haga clic en Ejecutar. Esto ejecuta el procedimiento y vuelve a compilar el plan de consulta del procedimiento.

USE AdventureWorks2012;  
GO  
EXECUTE HumanResources.uspGetAllEmployees WITH RECOMPILE;  
GO  
  

Para volver a compilar un procedimiento almacenado mediante sp_recompile

  1. Conéctese al motor de base de datos.

  2. En la barra Estándar, haga clic en Nueva consulta.

  3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic en Ejecutar. En este ejemplo se crea un procedimiento sencillo que devuelve todos los empleados (nombres y apellidos proporcionados), sus títulos de trabajo y sus nombres de departamento desde una vista.

    A continuación, copie y pegue el ejemplo siguiente en la ventana de consulta y haga clic en Ejecutar. Esto no ejecuta el procedimiento, pero marca el procedimiento que se va a volver a compilar para que su plan de consulta se actualice la próxima vez que se ejecute el procedimiento.

USE AdventureWorks2012;  
GO  
EXEC sp_recompile N'HumanResources.uspGetAllEmployees';  
GO  
  

Véase también

Crear un procedimiento almacenado
Modificar un procedimiento almacenado
Cambiar el nombre de un procedimiento almacenado
Ver la definición de un procedimiento almacenado
Ver las dependencias de un procedimiento almacenado
DROP PROCEDURE (Transact-SQL)