Ricompilare una stored procedureRecompile a Stored Procedure

In questo argomento viene descritto come ricompilare una stored procedure in SQL Server 2017SQL Server 2017 utilizzando Transact-SQLTransact-SQL.This topic describes how to recompile a stored procedure in SQL Server 2017SQL Server 2017 by using Transact-SQLTransact-SQL. È possibile eseguire questa operazione in tre modi: usando l'opzione WITH RECOMPILE nella definizione della stored procedure o quando viene chiamata la stored procedure, tramite l'hint per la query RECOMPILE nelle singole istruzioni o usando la stored procedure di sistema sp_recompile .There are three ways to do this: WITH RECOMPILE option in the procedure definition or when the procedure is called, the RECOMPILE query hint on individual statements, or by using the sp_recompile system stored procedure. Questo argomento illustra l'uso dell'opzione WITH RECOMPILE quando si crea una definizione di stored procedure e si esegue una stored procedure esistente.This topic describes using the WITH RECOMPILE option when creating a procedure definition and executing an existing procedure. Descrive anche l'uso della stored procedure di sistema sp_recompile per ricompilare una stored procedure esistente.It also describes using the sp_recompile system stored procedure to recompile an existing procedure.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Indicazioni Recommendations

  • Quando una stored procedure viene compilata per la prima volta o viene ricompilata, il piano di query della stored procedure viene ottimizzato per lo stato corrente del database e dei relativi oggetti.When a procedure is compiled for the first time or recompiled, the procedure’s query plan is optimized for the current state of the database and its objects. Se i dati o la struttura di un database vengono modificati significativamente, con la ricompilazione di una stored procedure viene aggiornato e ottimizzato il piano di query della stored procedure per tali modifiche.If a database undergoes significant changes to its data or structure, recompiling a procedure updates and optimizes the procedure’s query plan for those changes. Ciò può migliorare le prestazioni di elaborazione della stored procedure.This can improve the procedure’s processing performance.

  • In alcuni casi la ricompilazione della stored procedure deve essere forzata, in altri invece avviene automaticamente.There are times when procedure recompilation must be forced and other times when it occurs automatically. La ricompilazione automatica ha luogo a ogni riavvio di SQL ServerSQL Server .Automatic recompiling occurs whenever SQL ServerSQL Server is restarted. Si verifica inoltre se vengono apportate modifiche alla progettazione fisica di una tabella sottostante a cui fa riferimento la stored procedure.It also occurs if an underlying table referenced by the procedure has undergone physical design changes.

  • È opportuno forzare la ricompilazione di una stored procedure anche per rispondere a un eventuale sniffing dei parametri riscontrato durante la compilazione.Another reason to force a procedure to recompile is to counteract the "parameter sniffing" behavior of procedure compilation. Quando SQL ServerSQL Server esegue le stored procedure, nella generazione del piano di query rientrano tutti i valori di parametri utilizzati dalla stored procedure durante la compilazione.When SQL ServerSQL Server executes procedures, any parameter values that are used by the procedure when it compiles are included as part of generating the query plan. Se tali valori rappresentano quelli standard utilizzati per le chiamate successive della stored procedure, questa beneficerà del piano di query a ogni compilazione ed esecuzione.If these values represent the typical ones with which the procedure is subsequently called, then the procedure benefits from the query plan every time that it compiles and executes. Se i valori dei parametri della stored procedure sono spesso atipici, le prestazioni possono migliorare con la forzatura di una ricompilazione della stored procedure e un nuovo piano basato su valori dei parametri diversi.If parameter values on the procedure are frequently atypical, forcing a recompile of the procedure and a new plan based on different parameter values can improve performance.

  • SQL ServerSQL Server presenta la ricompilazione di stored procedure a livello di istruzione. features statement-level recompilation of procedures. Quando in SQL ServerSQL Server vengono ricompilate le stored procedure, in realtà viene compilata solo l'istruzione che ha causato la ricompilazione, anziché la stored procedure completa.When SQL ServerSQL Server recompiles stored procedures, only the statement that caused the recompilation is compiled, instead of the complete procedure.

  • Se determinate query in una stored procedure utilizzano regolarmente valori atipici o temporanei, le prestazioni della stored procedure possono migliorare tramite l'utilizzo dell'hint per la query RECOMPILE all'interno delle query stesse.If certain queries in a procedure regularly use atypical or temporary values, procedure performance can be improved by using the RECOMPILE query hint inside those queries. Poiché vengono ricompilate solo le query che utilizzano l'hint per la query anziché la stored procedure completa, viene riprodotto il comportamento di ricompilazione a livello di istruzione di SQL ServerSQL Server.Since only the queries using the query hint will be recompiled instead of the complete procedure, SQL ServerSQL Server's statement-level recompilation behavior is mimicked. Oltre all'utilizzo dei valori dei parametri correnti della stored procedure, l'hint per la query RECOMPILE utilizza i valori di qualsiasi variabile locale inclusa nella stored procedure quando si compila l'istruzione.But in addition to using the procedure's current parameter values, the RECOMPILE query hint also uses the values of any local variables inside the stored procedure when you compile the statement. Per altre informazioni, vedere Hint per la query (Transact-SQL).For more information, see Query Hint (Transact-SQL).

Sicurezza Security

Autorizzazioni Permissions

OpzioneWITH RECOMPILE WITH RECOMPILE Option
Se si utilizza questa opzione alla creazione della definizione della stored procedure, è necessario disporre dell'autorizzazione CREATE PROCEDURE per il database e dell'autorizzazione ALTER per lo schema in cui verrà creata la stored procedure.If this option is used when the procedure definition is created, it requires CREATE PROCEDURE permission in the database and ALTER permission on the schema in which the procedure is being created.

Se questa opzione viene utilizzata in un'istruzione EXECUTE, richiede autorizzazioni EXECUTE sulla stored procedure.If this option is used in an EXECUTE statement, it requires EXECUTE permissions on the procedure. Le autorizzazioni non sono richieste per l'istruzione EXECUTE stessa, ma le autorizzazioni di esecuzione sono necessarie per la stored procedure a cui fa riferimento l'istruzione EXECUTE.Permissions are not required on the EXECUTE statement itself but execute permissions are required on the procedure referenced in the EXECUTE statement. Per altre informazioni, vedere EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

Hint per la query RECOMPILERECOMPILE Query Hint
Questa funzionalità viene usata quando si crea la stored procedure e si include l'hint nelle istruzioni Transact-SQLTransact-SQL nella stored procedure.This feature is used when the procedure is created and the hint is included in Transact-SQLTransact-SQL statements in the procedure. È pertanto necessario disporre dell'autorizzazione CREATE PROCEDURE per il database e dell'autorizzazione ALTER per lo schema in cui la stored procedure viene creata.Therefore, it requires CREATE PROCEDURE permission in the database and ALTER permission on the schema in which the procedure is being created.

Stored procedure di sistemasp_recompile sp_recompile System Stored Procedure
È richiesta l'autorizzazione ALTER per la stored procedure specificata.Requires ALTER permission on the specified procedure.

Utilizzo di Transact-SQL Using Transact-SQL

Per ricompilare una stored procedure utilizzando l'opzione WITH RECOMPILETo recompile a stored procedure by using the WITH RECOMPILE option

  1. Connettersi al Motore di databaseDatabase Engine.Connect to the Motore di databaseDatabase Engine.

  2. Dalla barra Standard fare clic su Nuova query.From the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute. In questo esempio seguente viene creata la definizione della stored procedure.This example creates the procedure definition.

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;  

Per ricompilare una stored procedure utilizzando l'opzione WITH RECOMPILETo recompile a stored procedure by using the WITH RECOMPILE option

  1. Connettersi al Motore di databaseDatabase Engine.Connect to the Motore di databaseDatabase Engine.

  2. Dalla barra Standard fare clic su Nuova query.From the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute. In questo esempio viene creata una stored procedure semplice tramite cui vengono restituiti tutti i dipendenti (per cui vengono indicati il nome e il cognome), le relative posizioni e i nomi dei reparti di appartenenza da una vista.This example creates a simple procedure that returns all employees (first and last names supplied), their job titles, and their department names from a view.

    Successivamente, copiare e incollare il secondo esempio di codice nella finestra Query, quindi fare clic su Esegui.And then copy and paste the second code example into the query window and click Execute. Verrà eseguita la stored procedure e verrà ricompilato il piano di query della stored procedure.This executes the procedure and recompiles the procedure’s query plan.

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

Per ricompilare una stored procedure utilizzando sp_recompileTo recompile a stored procedure by using sp_recompile

  1. Connettersi al Motore di databaseDatabase Engine.Connect to the Motore di databaseDatabase Engine.

  2. Dalla barra Standard fare clic su Nuova query.From the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute. In questo esempio viene creata una stored procedure semplice tramite cui vengono restituiti tutti i dipendenti (per cui vengono indicati il nome e il cognome), le relative posizioni e i nomi dei reparti di appartenenza da una vista.This example creates a simple procedure that returns all employees (first and last names supplied), their job titles, and their department names from a view.

    Successivamente, copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Then, copy and paste the following example into the query window and click Execute. La stored procedure non verrà eseguita, ma contrassegnata per la ricompilazione in modo che il relativo piano di query venga aggiornata alla successiva esecuzione della stored procedure.This does not execute the procedure but it does mark the procedure to be recompiled so that its query plan is updated the next time that the procedure is executed.

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

Vedere ancheSee Also

Creazione di una stored procedure Create a Stored Procedure
Modificare una stored procedure Modify a Stored Procedure
Rinominare una stored procedure Rename a Stored Procedure
Visualizzare la definizione di una stored procedure View the Definition of a Stored Procedure
Visualizzare le dipendenze di una stored procedure View the Dependencies of a Stored Procedure
DROP PROCEDURE (Transact-SQL) DROP PROCEDURE (Transact-SQL)