Sdílet prostřednictvím


Překompilovat uloženou proceduru

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLPdW (Analytics Platform System)Databáze SQL v Microsoft Fabric

Tento článek popisuje, jak rekompilovat uloženou proceduru v SQL Serveru pomocí jazyka Transact-SQL. Existují tři způsoby, jak to provést: WITH RECOMPILE možnost v definici procedury nebo při volání procedury, nápovědu k dotazu RECOMPILE pro jednotlivé příkazy nebo pomocí sp_recompile systémové uložené procedury.

Než začnete

Recommendations

  • Když se procedura zkompiluje poprvé nebo znovu zkompiluje, plán dotazu procedury je optimalizovaný pro aktuální stav databáze a jeho objektů. Pokud databáze prochází významnými změnami dat nebo struktury, rekompiace procedury aktualizuje a optimalizuje plán dotazu procedury pro tyto změny. To může zlepšit výkon zpracování postupu.

  • Existují situace, kdy musí být rekompilace procedur vynucena a jindy, když k ní dojde automaticky. K automatickému opětovnému zkompilování dochází při restartování SQL Serveru. K tomu dochází také v případě, že u podkladové tabulky odkazované postupem došlo ke změnám fyzického návrhu.

  • Dalším důvodem, proč vynutit rekompilaci procedury, je zabránit chování kompilace způsobené detekcí parametrů. Když SQL Server provádí procedury, všechny hodnoty parametrů, které jsou používány procedurou při kompilaci, jsou zahrnuty jako součást generování plánu dotazu. Pokud tyto hodnoty představují typické hodnoty, se kterými je procedura následně volána, pak procedura bude těžit z plánu dotazu pokaždé, když se zkompiluje a spustí. Pokud jsou hodnoty parametrů v postupu často atypické, vynucení rekompilu procedury a nového plánu založeného na různých hodnotách parametrů může zlepšit výkon.

  • SQL Server nabízí rekompilaci procedur na úrovni jednotlivých příkazů. Když SQL Server rekompiluje uložené procedury, je kompilován pouze příkaz, který způsobil rekompilace, místo kompletní procedury.

  • Pokud některé dotazy v rámci procedury pravidelně používají atypické nebo dočasné hodnoty, výkon procedury lze zlepšit pomocí nápovědy dotazu RECOMPILE uvnitř těchto dotazů. Vzhledem k tomu, že se místo kompletní procedury překompilují pouze ty dotazy, které používají nápovědu k dotazu, je chování překompilace na úrovni příkazů v SQL Serveru napodobeno. Kromě použití aktuálních hodnot parametrů procedury používá tip dotazu RECOMPILE také hodnoty všech místních proměnných uvnitř uložené procedury při kompilaci příkazu. Další informace naleznete v tématu Nápověda dotazu (Transact-SQL).

Note

Ve vyhrazených a bezserverových fondech Azure Synapse Analytics nejsou uložené procedury předkompilovaný kód, a proto je nelze znovu zkompilovat. Další informace najdete v tématu Použití uložených procedur pro vyhrazené fondy SQL ve službě Azure Synapse Analytics.

Zabezpečení

Permissions

MOŽNOST REKOMPILACE

Pokud se tato možnost používá při vytvoření definice procedury, vyžaduje oprávnění CREATE PROCEDURE v databázi a ALTER oprávnění ke schématu, ve kterém se procedura vytváří.

Pokud se tato možnost používá v příkazu EXECUTE, vyžaduje pro proceduru oprávnění EXECUTE. Oprávnění nejsou vyžadována u samotného příkazu EXECUTE, ale pro proceduru odkazovanou v příkazu EXECUTE jsou vyžadována oprávnění ke spuštění. Další informace naleznete v tématu EXECUTE (Transact-SQL).

Nápověda k příkazu RECOMPILE

Tato funkce se používá při vytváření procedury a nápověda je zahrnuta do příkazů Transact-SQL v postupu. Proto vyžaduje oprávnění CREATE PROCEDURE v databázi a ALTER oprávnění ke schématu, ve kterém se procedura vytváří.

uložená procedura systému sp_recompile

Vyžaduje oprávnění ALTER pro zadanou proceduru.

Použití Transact-SQL

  1. Připojte se k databázovému stroji.

  2. Na liště Standardní vyberte Nový dotaz.

  3. Zkopírujte a vložte následující příklad do okna dotazu a vyberte Spustit. Tento příklad vytvoří definici procedury.

    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;  
    

Chcete-li překompilovat uloženou proceduru pomocí možnosti WITH RECOMPILE.

Vyberte Nový dotaz, zkopírujte a vložte následující příklad kódu do okna dotazu a vyberte Spustit. Tím se provede procedura a znovu zkompiluje dotazový plán procedury.

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

Chcete-li překompilovat uloženou proceduru pomocí sp_recompile

Vyberte Nový dotaz, zkopírujte a vložte následující příklad do okna dotazu a vyberte Spustit. Tím se procedura nespustí, ale označí proceduru, která se má znovu zkompilovat, aby se plán dotazu aktualizoval při příštím spuštění procedury.

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

Další kroky

Vytvoření uložené procedury
upravit uloženou proceduru
přejmenovat uloženou proceduru
Zobrazení definice uložené procedury
zobrazení závislostí uložené procedury
DROP PROCEDURE (Transact-SQL)