Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná 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
Připojte se k databázovému stroji.
Na liště Standardní vyberte Nový dotaz.
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)