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
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Vrací Showplan v textové podobě pro Transact-SQL batch nebo pro konkrétní výkaz v rámci batch. Plán dotazu specifikovaný rukojetí plánu může být buď uložen do mezipaměti, nebo právě vykonáván. Tato tabulkově hodnotová funkce je podobná sys.dm_exec_query_plan (Transact-SQL), ale má následující rozdíly:
- Výstup plánu dotazu je vrácen v textové podobě.
- Výstup plánu dotazu není omezen velikostí.
- Jednotlivé příkazy v rámci dávky lze specifikovat.
Platí na: SQL Server (SQL Server 2008 (10.0.x) a novější), Azure SQL Database.
Syntaxe
sys.dm_exec_text_query_plan
(
plan_handle
, { statement_start_offset | 0 | DEFAULT }
, { statement_end_offset | -1 | DEFAULT }
)
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:
statement_start_offset | 0 | VÝCHOZÍ
Označuje v bajtech počáteční pozici dotazu, který řádek popisuje v textu svého dávkového nebo perzistentního objektu.
statement_start_offset je int. Hodnota 0 označuje začátek dávky. Výchozí hodnota je 0.
Počáteční offset příkazu lze získat z následujících dynamických správních objektů:
statement_end_offset | -1 | VÝCHOZÍ
Označuje v bajtech koncovou pozici dotazu, který řádek popisuje v textu svého dávkového nebo perzistentního objektu.
statement_start_offset je int.
Hodnota -1 označuje konec šarže. Výchozí hodnota je -1.
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 | nvarchar(max) | Obsahuje reprezentaci Showplan v době kompilace plánu provádění dotazu, která je specifikována pomocí plan_handle. Showplan je v textové podobě. 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 plánu vrácené tabulky pro sys.dm_exec_text_query_plan nevrací výstup ze Showplanu:
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 rukojeť plánu zachycena a kdy byla použita s sys.dm_exec_text_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. Showplany pro taková tvrzení nelze pomocí sys.dm_exec_text_query_plan vyvolat, 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_text_query_plan pro batch nebo uloženou proceduru. Místo toho musíte provést samostatné volání pro sys.dm_exec_text_query_plan pro plan_handle, které odpovídá uživatelem definované funkci.
Když ad hoc dotaz používá jednoduchou nebo nucenou parametrizaci, sloupec query_plan obsahuje pouze text příkazu a nikoli skutečný plán dotazu. Pro vrácení plánu dotazu volejte sys.dm_exec_text_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.
Povolení
Pro spuštění sys.dm_exec_text_query_plan musí být uživatel členem role pevného správce systému nebo mít oprávnění ZOBRAZIT STAV SERVERU 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
A. Získání plánu dotazů v cache pro pomalu běžící Transact-SQL dotaz nebo dávkový soubor
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 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án handle pro pomalu běžící dotaz nebo batch je .0x06000100A27E7C1FA821B10600 Následující příklad vrací plán dotazu pro specifikovaný plánový handle a používá výchozí hodnoty 0 a -1 k vrácení všech příkazů v dotazu nebo dávce.
USE master;
GO
SELECT query_plan
FROM sys.dm_exec_text_query_plan (0x06000100A27E7C1FA821B10600,0,-1);
GO
B. Načtení každého plánu 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_text_query_plan následujícím způsobem. Výstup Showplanu pro každý plán, který je aktuálně v plánové cache, je ve sloupci query_plan tabulky, která se vrací.
USE master;
GO
SELECT *
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_text_query_plan(cp.plan_handle, DEFAULT, DEFAULT);
GO
C. Získávání každého plánu 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_text_query_plan následujícím způsobem. Výstup Showplanu pro každý plán je ve sloupci query_plan tabulky, která se vrací.
USE master;
GO
SELECT * FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset);
GO
D. Získávání informací o pěti nejčastějších dotazech podle průměrné doby CPU
Následující příklad vrací plány dotazů a průměrný čas CPU pro pět nejčastějších dotazů. Funkce sys.dm_exec_text_query_plan specifikuje výchozí hodnoty 0 a -1 pro vrácení všech příkazů v dávce v plánu 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_text_query_plan(qs.plan_handle, 0, -1)
ORDER BY total_worker_time/execution_count DESC;
GO
Viz také