Sdílet prostřednictvím


sys.dm_exec_query_plan (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrací Showplan ve formátu XML pro dávku specifikovanou plánovým handlem. Plán určený rukojetím plánu může být buď uložen do mezipaměti, nebo právě vykonáván.

XML schéma pro Showplan je publikováno a dostupné na této webové stránce Microsoftu. Je také dostupný v adresáři, kde je SQL Server nainstalován.

Transact-SQL konvence syntaxe

Syntaxe

sys.dm_exec_query_plan(plan_handle)  

Arguments

plan_handle
Je token, který jednoznačně identifikuje plán provedení dotazu pro dávku, která byla vykonána a její plán se nachází v cache plánu, nebo je právě vykonává. plan_handle je varbinary(64).

Plan_handle lze získat z následujících objektů dynamické správy:

Vrácená tabulka

Název sloupce Datový typ Description
dbid smallint ID kontextové databáze, která se projevila při kompilaci příkazu Transact-SQL odpovídající tomuto plánu. Pro ad hoc a připravené příkazy SQL ID databáze, ve které byly příkazy zkompilovány.

Sloupec je nullable.
ID objektu int ID objektu (například uložená procedura nebo uživatelem definovaná funkce) pro tento plán dotazu. Pro ad hoc a připravené dávky má tento sloupec hodnotu null.

Sloupec je nullable.
number smallint Celé číslo očíslované uložené procedury. Například skupina procedur pro aplikaci příkazů může být pojmenována orderproc; 1, orderproc; 2, a tak dále. Pro ad hoc a připravené dávky má tento sloupec hodnotu null.

Sloupec je nullable.
zakódovaný bit Určuje, jestli je odpovídající uložená procedura zašifrovaná.

0 = nezašifrováno

1 = šifrované

Sloupec není nulovatelný.
query_plan xml Obsahuje reprezentaci Showplan v době kompilace plánu provádění dotazu, která je specifikována pomocí plan_handle. Showplan je ve formátu XML. Jeden plán se vygeneruje pro každou dávku, která obsahuje například ad hoc příkazy Transact-SQL, volání uložených procedur a volání funkcí definovaná uživatelem.

Sloupec je nullable.

Poznámky

Za následujících podmínek se v sloupci query_plan vrácené tabulky pro sys.dm_exec_query_plan nevrací výstup ze Showplan:

  • Pokud byl plán dotazu specifikovaný pomocí plan_handle vyřazen z cache plánu, sloupec query_plan vrácené tabulky je null. Například tato podmínka může nastat, pokud existuje časové zpoždění mezi tím, kdy byla schránka plánu zachycena, a jejím použitím s sys.dm_exec_query_plan.

  • Některé Transact-SQL příkazy nejsou cacheovány, například příkazy pro hromadné operace nebo příkazy obsahující literály řetězců větší než 8 KB. XML Showplany pro takové příkazy nelze pomocí sys.dm_exec_query_plan získat, pokud se dávka právě nevykonává, protože v cache neexistují.

  • Pokud Transact-SQL batch nebo uložená procedura obsahuje volání uživatelsky definované funkce nebo volání dynamického SQL, například pomocí EXEC (string), zkompilovaný XML Showplan pro uživatelsky definovanou funkci není zahrnut v tabulce vrácené sys.dm_exec_query_plan pro batch nebo uloženou proceduru. Místo toho musíte provést samostatné volání pro sys.dm_exec_query_plan pro plánovací handle odpovídající uživatelem definované funkciji.

Když ad hoc dotaz používá jednoduchou nebo nucenou parametrizaci, sloupec query_plan obsahuje pouze text příkazu, nikoli skutečný plán dotazu. Pro vrácení plánu dotazu zavolejte sys.dm_exec_query_plan pro rukojeť plánu připraveného parametrizovaného dotazu. Zjistit, zda byl dotaz parametrizován, můžete odkazovat na sloupec SQL v pohledu sys.syscacheobjects nebo na textový sloupec v pohledu sys.dm_exec_sql_text dynamické správy.

Poznámka:

Kvůli omezení počtu vnořených úrovní povolených v XML datovém typu nemůže sys.dm_exec_query_plan vrátit plány dotazů, které splňují nebo překračují 128 úrovní vnořených prvků. V dřívějších verzích SQL Serveru tato podmínka zabránila vrácení plánu dotazu a vygenerování chyby 6335. V SQL Server 2005 (9.x) Service Pack 2 a novějších verzích sloupec query_plan vrací NULL.
Můžete použít dynamickou správu sys.dm_exec_text_query_plan (Transact-SQL ) k vrácení výstupu plánu dotazu v textové podobě.

Povolení

Pro spuštění sys.dm_exec_query_plan musí být uživatel členem role pevného správce systému nebo mít VIEW SERVER STATE oprávnění na serveru.

Oprávnění pro SQL Server 2022 a novější

Vyžaduje oprávnění ZOBRAZIT STAV VÝKONU SERVERU na serveru.

Examples

Následující příklady ukazují, jak používat sys.dm_exec_query_plan dynamický pohled na správu.

Pro zobrazení XML Showplans spusťte následující dotazy v Query Editoru SQL Server Management Studio, poté klikněte na ShowPlanXML ve sloupci query_plan tabulky vrácené sys.dm_exec_query_plan. XML Showplan se zobrazí v panelu souhrnu Management Studio. Pro uložení XML Showplanu do souboru klikněte pravým tlačítkem na ShowPlanXML ve sloupci query_plan , klikněte na Uložit výsledky jako, pojmenujte soubor ve formátu <file_name.sqlplan>; například MyXMLShowplan.sqlplan.

A. Získejte plán dotazů v cache pro pomalu běžící Transact-SQL dotaz nebo dávkový soubor

Plány dotazů pro různé typy Transact-SQL dávek, jako jsou ad hoc dávky, uložené procedury a uživatelsky definované funkce, jsou uloženy do oblasti paměti nazývané plánová cache. Každý cacheovaný plán dotazu je identifikován jedinečným identifikátorem nazývaným plánový handle. Tento plán můžete zadat pomocí sys.dm_exec_query_plan dynamického pohledu správy, abyste získali plán provedení pro konkrétní Transact-SQL dotaz nebo dávku.

Pokud Transact-SQL dotaz nebo batch běží dlouho na konkrétním spojení se SQL Serverem, získejte plán provedení tohoto dotazu nebo dávkového vyšetření, abyste zjistili, co způsobuje zpoždění. Následující příklad ukazuje, jak získat XML Showplan pro pomalu běžící dotaz nebo dávku.

Poznámka:

Pro tento příklad nahraďte hodnoty session_id a plan_handle hodnotami specifickými pro váš server.

Nejprve získáte ID relace (SPID) pro proces, který dotaz nebo dávku vykonává, pomocí uložené procedury sp_who :

USE master;  
GO  
exec sp_who;  
GO  

Výsledná množina, která je vrácena , sp_who označuje, že ID relace je 54. Můžete použít ID relace v dynamickém pohledu sys.dm_exec_requests správy k získání plánu pomocí následujícího dotazu:

USE master;  
GO  
SELECT * FROM sys.dm_exec_requests  
WHERE session_id = 54;  
GO  

Tabulka, kterou sys.dm_exec_requests vrátí, označuje, že plánová rukojeť pro pomalu běžící dotaz nebo batch je , 0x06000100A27E7C1FA821B10600kterou můžete zadat jako plan_handle argument s , sys.dm_exec_query_plan abyste získali plán vykonání ve formátu XML následovně. Plán provedení ve formátu XML pro pomalu běžící dotaz nebo dávku je obsažen ve sloupci query_plan tabulky vrácené .sys.dm_exec_query_plan

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_query_plan (0x06000100A27E7C1FA821B10600);  
GO  

B. Získejte každý plán dotazu z cache plánu

Pro získání snímku všech plánů dotazů umístěných v cache plánů načtěte rukojeti plánů všech plánů dotazů v cache dotazem sys.dm_exec_cached_plans do dynamického pohledu správy. Rukojeti plánu jsou uloženy ve sloupci plan_handle .sys.dm_exec_cached_plans Poté použijte operátor CROSS APPLY k předání rukojeti plánu sys.dm_exec_query_plan následujícím způsobem. Výstup XML Showplanu pro každý plán, který je aktuálně v plánové cache, je ve sloupci query_plan tabulky, která je vrácena.

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);  
GO  

C. Získejte každý plán dotazů, pro který server shromáždil statistiky dotazů, z cache plánu

Pro získání snímku všech plánů dotazů, pro které server shromáždil statistiky, jež se aktuálně nacházejí v cache plánů, načtěte plánové rukojeti těchto plánů v cache dotazem do sys.dm_exec_query_stats dynamického pohledu správy. Rukojeti plánu jsou uloženy ve sloupci plan_handle .sys.dm_exec_query_stats Poté použijte operátor CROSS APPLY k předání rukojeti plánu sys.dm_exec_query_plan následujícím způsobem. Výstup XML Showplanu pro každý plán, pro který server aktuálně shromáždil statistiky v cache plánu, je ve sloupci query_plan tabulky, která je vrácena.

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle);  
GO  

D. Získejte informace o pěti nejčastějších dotazech podle průměrné doby CPU

Následující příklad vrací plány a průměrný čas CPU pro pět nejčastějších dotazů.

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],  
   plan_handle, query_plan   
FROM sys.dm_exec_query_stats AS qs  
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)  
ORDER BY total_worker_time/execution_count DESC;  
GO  

Viz také

zobrazení a funkce dynamické správy (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.dm_exec_query_stats (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sp_who (Transact-SQL)
Showplan: Odkaz na logické a fyzické operátory
sys.dm_exec_text_query_plan (Transact-SQL)