Articles

kompilera om till lagrad procedur

  • 10/28/2019
  • 4 minuter att läsa
    • s
    • M
    • m
    • d
    • m
    • +2

gäller för: SQL Server (alla versioner som stöds) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics parallel data warehouse

det här avsnittet beskriver hur du kompilerar om en lagrad procedur i SQL Server med Transact-SQL. Det finns tre sätt att göra detta: med alternativet kompilera om i procedurdefinitionen eller när proceduren anropas, tipset om KOMPILERINGSFRÅGAN på enskilda uttalanden eller genom att använda proceduren sp_recompile-systemet lagrat. Det här avsnittet beskriver hur du använder alternativet med kompilering när du skapar en procedurdefinition och utför en befintlig procedur. Den beskriver också att använda sp_recompile system lagrad procedur för att kompilera om en befintlig procedur.

i detta ämne

  • innan du börjar:

    rekommendationer

    säkerhet

  • för att kompilera om en lagrad procedur med:

    Transact-SQL

innan du börjar

rekommendationer

  • När en procedur sammanställs för första gången eller kompileras om, optimeras procedurens frågeplan för databasens aktuella tillstånd och dess objekt. Om en databas genomgår betydande ändringar av dess data eller struktur uppdateras omkompilering av en procedur och optimerar procedurens frågeplan för dessa ändringar. Detta kan förbättra procedurens bearbetningsprestanda.

  • det finns tillfällen då procedurkompilering måste tvingas och andra gånger när det sker automatiskt. Automatisk kompilering sker när SQL Server startas om. Det inträffar också om en underliggande tabell som refereras till av proceduren har genomgått fysiska designändringar.

  • en annan anledning att tvinga ett förfarande att kompilera om är att motverka ”parameter sniffing” – beteendet för procedurkompilering. När SQL Server utför procedurer ingår alla parametervärden som används av proceduren när den sammanställer som en del av att generera frågeplanen. Om dessa värden representerar de typiska med vilka proceduren senare kallas, drar proceduren nytta av frågeplanen varje gång den sammanställer och kör. Om parametervärden på proceduren ofta är atypiska kan tvinga en omkompilering av proceduren och en ny plan baserad på olika parametervärden förbättra prestanda.

  • SQL Server funktioner uttalande nivå omkompilering av förfaranden. När SQL Server kompilerar lagrade procedurer kompileras endast uttalandet som orsakade omkompileringen istä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 genom att använda tipset om kompilering i dessa frågor. Eftersom endast de frågor som använder frågetipset kommer att kompileras om istället för hela proceduren, efterliknas SQL Servers omkompileringsbeteende på statement-nivå. Men förutom att använda procedurens aktuella parametervärden använder tipset om kompilering också värdena för alla lokala variabler i den lagrade proceduren när du kompilerar uttalandet. Mer information finns i fråga tips (Transact-SQL).

säkerhet

behörigheter

med KOMPILERINGSALTERNATIV
om det här alternativet används när procedurdefinitionen skapas krävs det skapa PROCEDURBEHÖRIGHET i databasen och ändra behörighet för schemat där proceduren skapas.

om det här alternativet används i ett exekvera-uttalande krävs det KÖRBEHÖRIGHETER för proceduren. Behörigheter krävs inte för själva exekvera-uttalandet, men exekvera behörigheter krävs för proceduren som refereras till i exekvera-uttalandet. Mer information finns i kör (Transact-SQL).

RECOMPILE Query tips
den här funktionen används när proceduren skapas och tipset ingår i Transact-SQL-satser i proceduren. Därför kräver det CREATE PROCEDURE tillstånd i databasen och ändra tillstånd på schemat där proceduren skapas.

Sp_recompile system lagrad procedur
kräver ändra tillstånd för den angivna proceduren.

använda Transact-SQL

  1. Anslut till databasmotorn.

  2. från standardfältet klickar du på ny fråga.

  3. kopiera och klistra in följande exempel i frågefönstret och klicka på Kör. Detta exempel skapar procedurdefinitionen.

    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; 

om du vill kompilera om en lagrad procedur med alternativet med kompilering

Välj Ny fråga, kopiera och klistra in följande kodexempel i frågefönstret och klicka på Kör. Detta utför proceduren och kompilerar om procedurens frågeplan.

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

om du vill kompilera om en lagrad procedur genom att använda sp_recompile

Välj Ny fråga, kopiera och klistra in följande exempel i frågefönstret och klicka på Kör. Detta utför inte proceduren men det markerar proceduren som ska kompileras om så att dess frågeplan uppdateras nästa gång proceduren körs.

USE AdventureWorks2012; GO EXEC sp_recompile N'dbo.uspProductByVendor'; GO

Se även

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)