sys.dm_exec_plan_attributes (Transact-SQL)

Vonatkozik a következőkre: SQL Server 2016 (13.x) és későbbi verziók Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

A terv által meghatározott terv attribútumára egy sort ad vissza. Ezt a táblázatértékű függvényt használhatod arra, hogy információkat kapj egy adott tervről, például a cache kulcsértékekről vagy a terv aktuális egyidejű végrehajtásának számáról.

Note

Ezen a függvényen keresztül visszaküldött információk egy része a sys.syscacheobjects visszafelé kompatibilitási nézetre képezhető meg.

Syntax

sys.dm_exec_plan_attributes ( plan_handle )  

Arguments

plan_handle
Egyedileg azonosítja egy lekérdezési tervet egy olyan csomagra, amely már elindult, és amelynek terve a terv cache-ben található. plan_handlevarbinary(64). A terv kezelő sys.dm_exec_cached_plans dinamikus menedzsment nézetből kapható.

Visszajuttatott tábla

Oszlop neve Adattípus Leírás
attribútum varchar(128) A tervhez tartozó attribútumnak a neve. Az alábbi táblázat felsorolja a lehetséges attribútumokat, adattípusokat és leírásokat.
érték sql_variant Az attribútum értéke, amely ehhez a tervhez kapcsolódik.
is_cache_key bit Jelzi, hogy az attribútum a terv cache keresőkulcsának részeként van-e használatban.

A fenti táblázatból az attribútum a következő értékeket kaphatja:

Attribute Adattípus Leírás
set_options int Jelzi azokat az opcióértékeket, amelyekkel a tervet összeállították.
objektumazonosító int Az egyik fő kulcs, amit egy objektum keresésére használnak a gyorsítótárban. Ez az objektumazonosító, amelyet a sys.objects adatbázis objektumokhoz (eljárások, nézetek, triggerek stb.) tárolnak. "Adhoc" vagy "Prepared" típusú tervek esetén ez a batch szöveg belső hash-je.
dbid int Az adatbázis azonosítója, amely tartalmazza azt az entitást, amelyre a terv utal.

Ad hoc vagy előkészített tervek esetén az adatbázis azonosítója az adott adás végrehajtása.
dbid_execute int A Resource adatbázisban tárolt rendszerobjektumok esetén az az adatbázisazonosító, amelyből a gyorsítótározott tervet hajtják végre. Minden más esetben 0.
felhasználó_azonosító int A -2 értéke azt jelzi, hogy a benyújtott tétel nem függ implicit névfelbontástól, és megosztható különböző felhasználók között. Ez az előnyben részesített módszer. Bármely más érték a lekérdezést benyújtó felhasználó felhasználói azonosítóját jelenti az adatbázisban.
language_id smallint Annak a nyelvnek az azonosítója, amely létrehozta a cache objektumot. További információ: sys.syslanguages (Transact-SQL).
dátumformátum smallint A cache objektumot létrehozó kapcsolat dátumformátuma. További információ: SET DATEFORMAT (Transact-SQL).
date_first tinyint A dátum első értéke. További információ: SET DATEFIRST (Transact-SQL).
compat_level tinyint A lekérdezési tervet lefordított adatbázisban beállított kompatibilitási szintet képviseli. A visszaadott kompatibilitási szint az adott hoc állítások jelenlegi adatbázis-kontextusának kompatibilitási szintje, és nem befolyásolja a QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n lekérdezési tipp. A tárolt eljárásban vagy függvényben található állítások esetén ez megfelel annak az adatbázis kompatibilitási szintjének, amelyben a tárolt eljárás vagy függvény létrejött.
állapot int Belső státuszbitek, amelyek a cache keresőkulcs részei.
required_cursor_options int A felhasználó által megadott kurzorbeállítások, például a kurzor típusa.
acceptable_cursor_options int Az SQL Server implicit módon átalakítható kurzorbeállítások az utasítás végrehajtásának támogatása érdekében. Például a felhasználó megadhat egy dinamikus kurzort, de a lekérdezésoptimalizáló engedélyezett arra, hogy ezt a kurzortípust statikus kurzorrá alakítsa.
merge_action_type smallint Az utasítás eredményeként használt eseményindító végrehajtási tervének MERGE típusa.

0 egy nem trigger tervet, egy olyan trigger tervet, amely nem egy utasítás eredménye alapján hajt végre MERGE , vagy egy olyan trigger tervet, amely egy olyan utasítás eredménye alapján hajt végre MERGE , amely csak egy DELETE műveletet megad.

Az 1 egy INSERT utasítás eredményeként MERGE futó eseményindító-tervet jelöl.

A 2 egy UPDATE utasítás eredményeként MERGE futó eseményindító-tervet jelez.

A 3 egy DELETE eseményindító-tervet jelöl, amely egy MERGE megfelelő INSERT vagy UPDATE műveletet tartalmazó utasítás eredményeként fut.

A kaszkádolt műveletek által futtatott beágyazott eseményindítók esetében ez az érték annak az utasításnak a MERGE művelete, amely a kaszkádolást okozta.
is_replication_specific int Azt jelenti, hogy a terv fordításából készült session egy olyan szekció, amely egy dokumentálatlan kapcsolati tulajdonsággal csatlakozik az SQL Server példányához, amely lehetővé teszi a szerver számára, hogy a szekciót replikációs komponensek által létrehozott jelenségként azonosítsa, így a szerver bizonyos funkcionális aspektusainak viselkedése változik az adott replikációs komponensek elvárásai szerint.
optional_spid smallint A session_id (spid) kapcsolat a cache kulcs részévé válik, hogy csökkentse az újrafordítások számát. Ez megakadályozza, hogy egyetlen ülésszak újrafordítása legyen egy nem dinamikusan kötött ideiglenes táblákat tartalmazó terv újrafelhasználása.
optional_clr_trigger_dbid int Csak CLR DML trigger esetén van feltöltve. Az entitást tartalmazó adatbázis azonosítója.

Bármely más objektumtípus esetén nullát ad vissza.
optional_clr_trigger_objid int Csak CLR DML trigger esetén van feltöltve. A sys.objects-ben tárolt objektumazonosító.

Bármely más objektumtípus esetén nullát ad vissza.
parent_plan_handle varbinary(64) Mindig NULL.
is_azure_user_plan tinyint 1 egy Azure SQL adatbázisban végrehajtott lekérdezésekhez, amelyeket egy felhasználó által indított ülésből hajtanak végre.

0 olyan lekérdezések esetén, amelyeket egy olyan ülésből hajtottak végre, amelyeket nem egy végfelhasználó indított, hanem az Azure infrastruktúrán belül futó alkalmazások indítottak le, és más célokra küldenek lekérdezéseket telemetria gyűjtésére vagy adminisztratív feladatok végrehajtására. Az ügyfeleknek nem számítanak fel olyan erőforrásokért, amelyeket lekérdezések fogyasztanak el, ahol is_azure_user_plan = 0.

Csak Azure SQL Database.
inuse_exec_context int A jelenleg végrehajtó tételek száma, amelyek a lekérdezési tervet használják.
free_exec_context int A lekérdezési tervhez tartozó gyorsítótározott végrehajtási kontextusok száma, amelyek jelenleg nem használatban vannak.
hits_exec_context int Hányszor szerezték meg a végrehajtási kontextust a tervgyorsítótárból és használták újra, így megtakarítva az SQL utasítás újrafordításának többletköltségét. Az érték az eddigi összes kötött végrehajtás összege.
misses_exec_context int Hányszor nem találtak végrehajtási kontextust a tervgyorsítótárban, ami új végrehajtási kontextus létrehozásához vezetett a batch végrehajtáshoz.
removed_exec_context int Azok száma a végrehajtási kontextusok, amelyeket a cache-re gyakorolt memórianyomás miatt töröltek.
inuse_cursors int A jelenleg futó tételek száma, amelyek egy vagy több kurzort tartalmaznak, és a gyorsítótározott tervet használják.
free_cursors int A gyorsatáros csomaghoz használt üres vagy szabad kurzorok száma.
hits_cursors int Hányszor szereztek inaktív kurzort a gyorsítótározott tervből és újrahasználtak. Az érték az eddigi összes kötött végrehajtás összege.
misses_cursors int Hányszor nem találtak inaktív kurzort a gyorsítótárban.
removed_cursors int Hány kurzor került eltávolításra a cache csomag memórianyomása miatt.
sql_handle varbinary(64) Az SQL handle a batchhez.

Permissions

Az SQL Serveren VIEW SERVER STATE engedély szükséges.

Az Azure SQL Database Alapszintű, S0 és S1 szolgáltatási célkitűzésein, valamint rugalmas készletekben lévő adatbázisok esetében a kiszolgálói rendszergazdai fiókra vagy a Microsoft Entra rendszergazdai fiókra van szükség. Minden más SQL Database szolgáltatás célnál az VIEW DATABASE STATE engedély az adatbázisban szükséges.

Engedélyek az SQL Server 2022-hez és újabb verziókhoz

SERVER PERFORMANCE STATE engedélyt igényel VIEW a szerveren.

Megjegyzések

Beállítások megadása

Ugyanannak a lefordított tervnek a másolatai csak a set_options oszlopban szereplő érték alapján különbözhetnek. Ez azt jelzi, hogy különböző kapcsolatok eltérő opciókat SET használnak ugyanazzal a lekérdezéssel. A különböző opciók használata általában nem kívánatos, mert ez plusz fordításokat, kevesebb terv újrahasználatot és gyorsítótár felfújását okozhat, mivel több terv van a gyorstárban.

Halmazopciók értékelése

Ahhoz, hogy a set_options-ben visszaadott értéket a terv összeállított opcióihoz fordítsuk, vonjuk le az értékeket a set_options értékből, a lehető legnagyobb értéktől kezdve, amíg el nem éred a 0-ot. Minden kivonás érték megfelel egy olyan opciónak, amelyet a lekérdezési tervben használtak. Például, ha set_options értéke 251, akkor a terv összeállított opciói a következők: ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), párhuzamos terv(2) és ANSI_PADDING (1).

Option Érték
ANSI_PADDING 1
ParallelPlan

Ez azt jelzi, hogy a tervpárhuzamossági lehetőségek megváltoztak.
2
FORCEPLAN 4
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

Jelzi, hogy a terv nem használ munkatáblát a FOR BROWSE művelet megvalósításához.
512
TriggerOneRow

Jelzi, hogy a terv tartalmaz egy soros optimalizációt AFTER trigger delta táblákhoz.
1024
ResyncQuery

Jelzi, hogy a lekérdezést belső rendszer által tárolt eljárások küldték be.
2048
ARITH_ABORT 4096
NUMERIC_ROUNDABORT 8192
DATEFIRST 16384
DATEFORMAT 32768
LanguageID 65536
ON

Azt jelzi, hogy az adatbázis PARAMÉTEREZÉS opció FORCED volt beállítva a terv fordításakor.
131 072
ROWCOUNT Vonatkozik a következőkre: SQL Server 2012 (11.x) és újabbá

262144

Cursors

Az inaktív kurzorokat egy lefordított tervben gyorsítják be, hogy a kurzor tárolásához használt memóriát a kurzorok párhuzamos felhasználói újra felhasználhassák. Például tegyük fel, hogy egy tétel deklarál és használ egy kurzort anélkül, hogy leosztaná azt. Ha két felhasználó hajtja végre ugyanazt a kötetet, akkor két aktív kurzor lesz. Miután a kurzorokat széthelyezik (esetleg különböző kötetekben), a kurzor tárolására használt memória gyorsatárba kerül, és nem szabadul. Ez az inaktív kurzorok listája a lefordított tervben van. Amikor a felhasználó legközelebb végrehajtja a batch-et, a gyorsítótározott kurzormemóriát újrahasznosítják és megfelelő módon inicializálják aktív kurzorként.

Kurzor opciók értékelése

Ahhoz, hogy a required_cursor_options és acceptable_cursor_options-ben visszaadott értéket a terv lefordított opcióira fordítsuk, vond le az értékeket az oszlop értékéből, a lehető legnagyobb értéktől kezdve, amíg el nem éred a 0-ot. Minden kivonás érték megfelel egy kurzor opciónak, amelyet a lekérdezési tervben használtak.

Option Érték
Nincs 0
ÉRZÉKETLEN 1
KÉZIRATTEKERCS 2
CSAK OLVASHATÓ 4
EZÉRT UPDATE 8
LOCAL 16
GLOBAL 32
FORWARD_ONLY 64
KEYSET 128
DYNAMIC 256
SCROLL_LOCKS 512
OPTIMISTA 1024
STATIC 2048
FAST_FORWARD 4096
HELYBEN 8192
EZÉRT select_statement 16384

Examples

A. A megadott terv attribútumainak visszaküldése

Az alábbi példa egy meghatározott terv összes terv attribútumát visszaadja. Először a sys.dm_exec_cached_plans dinamikus menedzsment nézetet kérik, hogy megkapjuk a megadott terv terv handle címét. A második lekérdezésben <plan_handle> helyettesítsd az első lekérdezés terve handle értékét.

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. Visszaküldöm a SET fordított tervek opcióit és az SQL handle gyorsítótáros tervek számára

A következő példa egy értéket ad vissza, amely az egyes tervek által összeállított opciókat jelöli. Ezen felül visszakerül az összes gyorsatározott terv SQL handle is.

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