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í na: SQL Server 2016 (13.x) a novější verze
Azure SQL Database
Azure SQL Managed Instance
SQL 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)