Sdílet prostřednictvím


sys.dm_exec_plan_attributes (Transact-SQL)

Platí na: SQL Server 2016 (13.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Vrací jeden řádek na atribut plánu pro plán určený rukojetí plánu. Tuto tabulkovou funkci můžete použít k získání detailů o konkrétním plánu, například hodnoty klíčů v cache nebo počet aktuálních současných provedení plánu.

Poznámka:

Některé informace vrácené touto funkcí se mapují do pohledu zpětné kompatibility sys.syscacheobjects .

Syntaxe

sys.dm_exec_plan_attributes ( plan_handle )  

Arguments

plan_handle
Jednoznačně identifikuje dotazovací plán pro dávku, která byla vykonána a jejíž plán se nachází v plánové cache. plan_handle je varbinary(64). Rukojeť plánu lze získat z pohledu sys.dm_exec_cached_plans dynamického řízení.

Vrácená tabulka

Název sloupce Datový typ Description
atribut varchar(128) Název atributu spojeného s tímto plánem. Tabulka bezprostředně pod touto uvádí možné atributy, jejich datové typy a popisy.
value sql_variant Hodnota atributu spojeného s tímto plánem.
is_cache_key bit Označuje, zda je atribut použit jako součást klíče pro vyhledávání v cache pro plán.

Z výše uvedené tabulky může mít atribut následující hodnoty:

Vlastnost Datový typ Description
set_options int Označuje hodnoty opcí, se kterými byl plán sestaven.
identifikátor objektu int Jeden z hlavních klíčů používaných pro vyhledávání objektu v cache. Toto je ID objektu uložené v sys.objects pro databázové objekty (procedury, pohledy, triggery atd.). U plánů typu "Adhoc" nebo "Prepared" jde o interní hash dávkového textu.
dbid int Je ID databáze obsahující entitu, na kterou se plán odkazuje.

U ad hoc nebo připravených plánů je to ID databáze, ze kterého se batch vykonává.
dbid_execute int Pro systémové objekty uložené v databázi zdrojů je to ID databáze, ze kterého je plán v cache vykonán. Ve všech ostatních případech je to 0.
uživatelské ID int Hodnota -2 znamená, že odeslaná dávka nezávisí na implicitním rozlišení jmen a může být sdílena mezi různými uživateli. Toto je upřednostňovaná metoda. Jakákoli jiná hodnota představuje uživatelské ID uživatele, který dotaz zadává v databázi.
language_id smallint ID jazyka spojení, které vytvořilo objekt cache. Další informace naleznete v tématu sys.syslanguages (Transact-SQL).
date_format smallint Datový formát spojení, které vytvořilo objekt cache. Další informace naleznete v tématu SET DATEFORMAT (Transact-SQL).
date_first tinyint Datum první hodnoty. Další informace naleznete v tématu SET DATEFIRST (Transact-SQL).
compat_level tinyint Představuje úroveň kompatibility nastavenou v databázi, v jejímž kontextu byl plán dotazu zkompilován. Vrácená úroveň kompatibility je úroveň kompatibility aktuálního databázového kontextu pro ad-hoc příkazy a není ovlivněna dotazovací nápovědou QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n. U příkazů obsažených v uložené procedurě nebo funkci odpovídá úrovni kompatibility databáze, ve které je uložená procedura nebo funkce vytvořena.
stav int Interní stavové bity, které jsou součástí klíče pro vyhledávání v cache.
required_cursor_options int Možnosti kurzoru zadané uživatelem, například typ kurzoru.
acceptable_cursor_options int Možnosti kurzoru, na které se SQL Server může implicitně převést, aby podporovaly provádění příkazu. Například uživatel může zadat dynamický kurzor, ale optimalizátor dotazu může tento typ kurzoru převést na statický kurzor.
merge_action_type smallint Typ plánu spuštění spouště použitý jako výsledek příkazu MERGE.

0 označuje plán bez spouštění, spouštěcí plán, který se neskonechuje jako výsledek příkazu MERGE, nebo plán spouštěčů, který se vykoná jako výsledek příkazu MERGE specifikujícího pouze akci DELETE.

1 označuje spouštěcí plán INSERT, který se spustí jako výsledek příkazu MERGE.

2 označuje spouštěcí plán UPDATE, který se spustí jako výsledek příkazu MERGE.

3 označuje spouštěcí plán DELETE, který se spustí jako výsledek příkazu MERGE obsahujícího odpovídající akci INSERT nebo UPDATE.

Pro vnořené spouštěče spuštěné kaskádovými akcemi je tato hodnota akcí příkazu MERGE, který způsobil kaskádu.
is_replication_specific int Představuje, že relace, ze které byl tento plán zkompilován, je ta, která se připojila k instanci SQL Serveru pomocí nedokumentované vlastnosti připojení, která umožňuje serveru identifikovat relaci jako relaci vytvořenou replikačními komponentami, takže chování určitých funkčních aspektů serveru se mění podle očekávání replikační komponenty.
optional_spid smallint Spojovací session_id (spid) se stává součástí klíče cache, aby se snížil počet překompilací. To zabraňuje opětovnému použití plánu zahrnujícího nedynamicky vázané dočasné tabulky při kompilaci pro jednu relaci.
optional_clr_trigger_dbid int Vyplňuje se pouze v případě spouštěče CLR DML. ID databáze obsahující danou entitu.

Pro jakýkoli jiný typ objektu vrací nula.
optional_clr_trigger_objid int Vyplňuje se pouze v případě spouštěče CLR DML. ID objektu uložené v sys.objects.

Pro jakýkoli jiný typ objektu vrací nula.
parent_plan_handle varbinary(64) Vždy NULL.
is_azure_user_plan tinyint 1 pro dotazy prováděné v databázi Azure SQL z relace iniciované uživatelem.

0 pro dotazy, které byly provedeny z relace, kterou neinicioval koncový uživatel, ale aplikacemi běžícími uvnitř Azure infrastruktury, které vysílají dotazy za jinými účely sběru telemetrie nebo provádění administrativních úkolů. Zákazníci nejsou účtováni za zdroje spotřebované dotazy, kde is_azure_user_plan = 0.

Azure SQL Database only.
inuse_exec_context int Počet aktuálně probíhajících skupin, které používají plán dotazů.
free_exec_context int Počet cacheovaných kontextů pro vykonávání dotazů, které nejsou aktuálně používány.
hits_exec_context int Počet případů byl kontext vykonání získán z cache plánu a znovu použit, čímž se šetřila režijní režie při překompilaci SQL příkazu. Hodnota je souhrn pro všechny dosavadní dávkové provedení.
misses_exec_context int Počet případů, kdy se v plánové cache nepodařilo najít kontext vykonávání, což vedlo k vytvoření nového kontextu pro dávkové vykonávání v rámci spouštění.
removed_exec_context int Počet kontextů vykonávání byl odstraněn kvůli tlaku na paměť uloženého plánu.
inuse_cursors int Počet aktuálně vykonávaných dávek obsahujících jeden nebo více kurzorů používajících cacheovaný plán.
free_cursors int Počet volných nebo volných kurzorů pro cacheovaný plán.
hits_cursors int Počet případů, kdy byl neaktivní kurzor získán z uloženého plánu a znovu použit. Hodnota je souhrn pro všechny dosavadní dávkové provedení.
misses_cursors int Kolikrát se nepodařilo najít neaktivní kurzor v cache.
removed_cursors int Počet kurzorů, které byly odstraněny kvůli tlaku paměti na cacheovaný plán.
sql_handle varbinary(64) SQL handle pro danou dávku.

Povolení

Na SQL Serveru je VIEW SERVER STATE potřeba povolení.

U cílů služeb Azure SQL Database Basic, S0 a S1 a u databází v elastických poolech je vyžadován administrátorský účet serveru nebo administrátorský účet Microsoft Entra . U všech ostatních cílů SQL databázové služby je oprávnění vyžadováno VIEW DATABASE STATE v databázi.

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

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

Poznámky

Nastavit možnosti

Kopie stejného sestaveného plánu se mohou lišit pouze hodnotou ve sloupci set_options . To naznačuje, že různé spoje používají různé sady SET možností pro stejný dotaz. Používání různých sad možností je obvykle nežádoucí, protože může způsobit další kompilace, méně opakovaného použití plánů a nafouknutí cache plánů kvůli více kopiím plánů v cache.

Hodnocení možností množin

Pro převedení hodnoty vrácené v set_options na opce, se kterými byl plán sestaven, odečtěte hodnoty od hodnoty set_options , začínaje největší možnou hodnotou, dokud nedosáhnete nuly. Každá hodnota, kterou odečtete, odpovídá možnosti, která byla použita v plánu dotazu. Například pokud je hodnota v set_options 251, možnosti, se kterými byl plán sestaven, jsou ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), Paralelní plán(2) a ANSI_PADDING (1).

Možnost Hodnota
ANSI_PADDING 1
ParallelPlan

Naznačuje, že možnosti paralelismu plánů se změnily.
2
FORCEPLAN 4
Nastavení CONCAT_NULL_YIELDS_NULL 8
ANSI_WARNINGS 16
ANSI_NULLS 32
QUOTED_IDENTIFIER 64
ANSI_NULL_DFLT_ON 128
ANSI_NULL_DFLT_OFF 256
NoBrowseTable

Označuje, že plán nepoužívá pracovní tabulku k implementaci operace FOR BROSVIEW.
512
TriggerOneRow

Označuje, že plán obsahuje optimalizaci jednoho řádku pro tabulky spouštěcích delt AFTER.
1024
ResyncQuery

Označuje, že dotaz byl odeslán interními systémovými uloženými procedurami.
2048
ARITH_ABORT 4096
NUMERIC_ROUNDABORT 8192
DATEFIRST 16384
DATEFORMAT 32768
ID jazyka 65536
NA

Označuje, že databázová volba PARAMETRIZACE byla při kompilaci plánu nastavena na NUCE.
131072
ROWCOUNT Platí na: SQL Server 2012 (11.x) a později

262144

Cursors

Neaktivní kurzory jsou uloženy do mezipaměti v kompilovaném plánu, aby paměť použitá k uložení kurzoru mohla být znovu využita současnými uživateli kurzorů. Například předpokládejme, že batch deklaruje a používá kurzor, aniž by ho dealokoval. Pokud dva uživatelé vykonávají stejnou dávku, budou aktivní dva kurzory. Jakmile jsou kurzory uvolněny (případně v různých dávkách), paměť použitá k uložení kurzoru je uložena do mezipaměti a neuvolňována. Tento seznam neaktivních kurzorů je uložen v kompilovaném plánu. Při dalším spuštění dávky uživatelem bude cacheovaná paměť kurzoru znovu použita a správně inicializována jako aktivní kurzor.

Vyhodnocení možností kurzoru

Pro překlad hodnoty vrácené v required_cursor_options a acceptable_cursor_options na opce, se kterými byl plán sestaven, odečtěte hodnoty od hodnoty sloupce, začínaje co největší hodnotou, dokud nedosáhnete nuly. Každá hodnota, kterou odečtete, odpovídá možnosti kurzoru, která byla použita v plánu dotazu.

Možnost Hodnota
None 0
NECITLIVÝ 1
SVITEK 2
POUZE ČTENÍ 4
PRO AKTUALIZACI 8
LOKÁLNÍ 16
GLOBÁLNÍ 32
FORWARD_ONLY 64
SADA KLÍČŮ 128
DYNAMICKÝ 256
SCROLL_LOCKS 512
OPTIMISTICKÝ 1024
STATICKÝ 2048
FAST_FORWARD 4096
NA MÍSTĚ 8192
ZA select_statement 16384

Examples

A. Vrácení atributů pro konkrétní plán

Následující příklad vrací všechny atributy plánu pro konkrétní plán. Nejprve se dotazuje dynamický sys.dm_exec_cached_plans management pohled, aby se získal přehled plánu pro specifikovaný plán. Ve druhém dotazu nahraďte <plan_handle> hodnotou plánu handle z prvního dotazu.

SELECT plan_handle, refcounts, usecounts, size_in_bytes, cacheobjtype, objtype   
FROM sys.dm_exec_cached_plans;  
GO  
SELECT attribute, [value], is_cache_key  
FROM sys.dm_exec_plan_attributes(<plan_handle>);  
GO  

B. Vrácení možností SET pro kompilované plány a SQL handle pro cacheované plány

Následující příklad vrací hodnotu reprezentující opce, se kterými byl každý plán sestaven. Navíc se vrací SQL handle pro všechny cacheované plány.

SELECT plan_handle, pvt.set_options, pvt.sql_handle  
FROM (  
    SELECT plan_handle, epa.attribute, epa.value   
    FROM sys.dm_exec_cached_plans   
        OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa  
    WHERE cacheobjtype = 'Compiled Plan') AS ecpa   
PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("set_options", "sql_handle")) AS pvt;  
GO  

Viz také

Zobrazení a funkce dynamické správy (Transact-SQL)
zobrazení a funkce související se spouštěním dynamické správy (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.databases (Transact-SQL)
sys.objects (Transact-SQL)