Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Analysplattformssystem (PDW)
SQL-databas i Förhandsversion av Microsoft Fabric
I den här artikeln beskrivs hur du kompilera om en lagrad procedur i SQL Server med hjälp av Transact-SQL. Det finns tre sätt att göra detta: WITH RECOMPILE alternativet i procedurdefinitionen eller när proceduren anropas, RECOMPILE-frågetipset för enskilda instruktioner eller med hjälp av den sp_recompile system lagrade proceduren.
Innan du börjar
Recommendations
När en procedur kompileras för första gången eller omkompileras optimeras procedurens frågeplan för databasens aktuella tillstånd och dess objekt. Om en databas genomgår betydande ändringar i dess data eller struktur, omkompilerar en procedur uppdateras och optimerar procedurens frågeplan för dessa ändringar. Detta kan förbättra procedurens bearbetningsprestanda.
Det finns tillfällen då omkompileringen av proceduren måste tvingas och andra gånger när den sker automatiskt. Automatisk omkompilering sker när SQL Server startas om. Det inträffar också om en underliggande tabell som refereras av proceduren har genomgått fysiska designändringar.
En annan anledning till att tvinga en procedur att kompilera om är att motverka beteendet "parametersniffning" för procedurkompilering. När SQL Server kör procedurer inkluderas alla parametervärden som används av proceduren när den kompileras som en del av genereringen av frågeplanen. Om dessa värden representerar de typiska värden som proceduren sedan anropas med, drar proceduren nytta av frågeplanen varje gång den kompileras och körs. Om parametervärdena i proceduren ofta är atypiska kan det förbättra prestandan genom att tvinga fram en omkompilering av proceduren och en ny plan baserad på olika parametervärden.
SQL Server har nykompilering av procedurer på instruktionsnivå. När SQL Server kompileras om lagrade procedurer kompileras endast den instruktion som orsakade omkompileringen i stället för hela proceduren.
Om vissa frågor i en procedur regelbundet använder atypiska eller tillfälliga värden kan procedurens prestanda förbättras med hjälp av RECOMPILE-frågetipset i dessa frågor. Eftersom endast de frågor som använder frågetipset kommer att kompileras om i stället för den fullständiga proceduren, efterliknas SQL Server:s omkompileringsbeteende på instruktionsnivå. Men förutom att använda procedurens aktuella parametervärden använder RECOMPILE-frågetipset även värdena för eventuella lokala variabler i den lagrade proceduren när du kompilerar -instruktionen. Mer information finns i Frågetips (Transact-SQL).
Note
I dedikerade och serverlösa Pooler i Azure Synapse Analytics är lagrade procedurer inte förkompilerad kod och kan därför inte kompileras om. Mer information finns i Använda lagrade procedurer för dedikerade SQL-pooler i Azure Synapse Analytics.
Security
Permissions
MED ALTERNATIVET KOMPILERA OM
Om det här alternativet används när procedurdefinitionen skapas krävs behörigheten SKAPA PROCEDUR i databasen och ALTER-behörighet för schemat där proceduren skapas.
Om det här alternativet används i en EXECUTE-instruktion krävs KÖR-behörigheter för proceduren. Behörigheter krävs inte för själva EXECUTE-instruktionen, men körbehörigheter krävs för proceduren som refereras i EXECUTE-instruktionen. Mer information finns i EXECUTE (Transact-SQL).
RECOMPILE-frågealternativ
Den här funktionen används när proceduren skapas och tipset ingår i Transact-SQL-instruktioner i proceduren. Därför krävs behörigheten SKAPA PROCEDUR i databasen och ALTER-behörighet för schemat där proceduren skapas.
sp_recompile lagrat systemprocedur
Kräver ALTER-behörighet för den angivna proceduren.
Using Transact-SQL
Anslut till databasmotorn.
I fältet Standard väljer du Ny fråga.
Kopiera och klistra in följande exempel i frågefönstret och välj Kör. I det här exemplet skapas procedurdefinitionen.
USE AdventureWorks2022; 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;
Om du vill kompilera om en lagrad procedur med alternativet WITH RECOMPILE
Välj Ny fråga, kopiera och klistra in följande kodexempel i frågefönstret och välj Kör. Den här kör proceduren och kompilerar om procedurens frågeplan.
USE AdventureWorks2022;
GO
EXECUTE HumanResources.uspProductByVendor WITH RECOMPILE;
GO
Om du vill kompilera om en lagrad procedur med hjälp av sp_recompile
Välj Ny fråga, kopiera och klistra in följande exempel i frågefönstret och välj Kör. Detta kör inte proceduren, men den markerar proceduren som ska omkompileras så att dess frågeplan uppdateras nästa gång proceduren körs.
USE AdventureWorks2022;
GO
EXEC sp_recompile N'dbo.uspProductByVendor';
GO
Next steps
Skapa en lagrad procedur
Ändra en lagrad procedur
byt namn på en lagrad procedur
Visa definitionen av en lagrad procedur
Visa beroenden för en lagrad procedur
DROP-procedur (Transact-SQL)