Delen via


sys.dm_exec_plan_attributes (Transact-SQL)

Van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Geeft één rij per planattribuut terug voor het plan dat door de planhandle is gespecificeerd. Je kunt deze tabel-waarde functie gebruiken om details te verkrijgen over een bepaald plan, zoals de cache-sleutelwaarden of het aantal huidige gelijktijdige uitvoeringen van het plan.

Opmerking

Een deel van de informatie die via deze functie wordt teruggegeven, wordt gekoppeld aan de achterwaartse compatibiliteitsweergave van sys.syscacheobjects .

Syntaxis

sys.dm_exec_plan_attributes ( plan_handle )  

Arguments

plan_handle
Identificeert uniek een queryplan voor een batch die is uitgevoerd en waarvan het plan zich in de plancache bevindt. plan_handle is varbinair(64). De planhandhaving kan worden verkregen uit de dynamische beheerweergave van sys.dm_exec_cached_plans .

Tabel geretourneerd

Kolomnaam Gegevenstype Description
attribuut varchar(128) Naam van het attribuut dat aan dit plan hoort. De tabel direct onder deze geeft een overzicht van de mogelijke attributen, hun datatypes en hun beschrijvingen.
waarde sql_variant Waarde van het attribuut dat aan dit plan is gekoppeld.
is_cache_key bit Geeft aan of het attribuut wordt gebruikt als onderdeel van de cache-lookup-sleutel voor het plan.

Uit de bovenstaande tabel kan het attribuut de volgende waarden hebben:

Attribute Gegevenstype Description
set_options int Geeft de optiewaarden aan waarmee het plan is samengesteld.
object-id int Een van de belangrijkste sleutels die worden gebruikt om een object in de cache op te zoeken. Dit is de object-ID die wordt opgeslagen in sys.objects voor databaseobjecten (procedures, views, triggers, enzovoort). Voor plannen van het type "Adhoc" of "Prepared" is het een interne hash van de batchtekst.
dbid int Is de ID van de database die de entiteit bevat waar het plan naar verwijst.

Voor ad hoc- of voorbereide plannen is het de database-ID waarvan de batch wordt uitgevoerd.
dbid_execute int Voor systeemobjecten die in de Resource-database zijn opgeslagen, is de database-ID waaruit het gecachte plan wordt uitgevoerd. Voor alle andere gevallen is het 0.
gebruikers-ID int De waarde van -2 geeft aan dat de ingediende batch niet afhankelijk is van impliciete naamresolutie en gedeeld kan worden tussen verschillende gebruikers. Dit is de voorkeursmethode. Elke andere waarde vertegenwoordigt de gebruikers-ID van de gebruiker die de zoekopdracht in de database indient.
language_id smallint ID van de taal van de verbinding die het cacheobject heeft gemaakt. Zie sys.syslanguages (Transact-SQL) voor meer informatie.
date_format smallint Datumformaat van de verbinding die het cacheobject heeft aangemaakt. Zie SET DATEFORMAT (Transact-SQL)voor meer informatie.
date_first tinyint Datum eerste waarde. Zie SET DATEFIRST (Transact-SQL)voor meer informatie.
compat_level tinyint Geeft het compatibiliteitsniveau weer dat is ingesteld in de database waarin het queryplan is samengesteld. Het teruggegeven compatibiliteitsniveau is het compatibiliteitsniveau van de huidige databasecontext voor adhoc-instructies, en wordt niet beïnvloed door de queryhint QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n. Voor statements in een opgeslagen procedure of functie komt dit overeen met het compatibiliteitsniveau van de database waarin de opgeslagen procedure of functie is aangemaakt.
status int Interne statusbits die deel uitmaken van de cache-lookupsleutel.
required_cursor_options int Cursoropties die zijn opgegeven door de gebruiker, zoals het cursortype.
acceptable_cursor_options int Cursoropties waarnaar SQL Server impliciet kan converteren om de uitvoering van de instructie te ondersteunen. De gebruiker kan bijvoorbeeld een dynamische cursor specificeren, maar de query-optimizer mag dit cursortype omzetten naar een statische cursor.
merge_action_type smallint Het type trigger-uitvoeringsplan dat wordt gebruikt als resultaat van een MERGE-instructie.

0 duidt op een niet-triggerplan, een triggerplan dat niet wordt uitgevoerd als gevolg van een MERGE-instructie, of een triggerplan dat wordt uitgevoerd als gevolg van een MERGE-instructie die alleen een DELETE-actie specificeert.

1 duidt op een INSERT-triggerplan dat draait als resultaat van een MERGE-instructie.

2 geeft een UPDATE-triggerplan aan dat draait als resultaat van een MERGE-instructie.

3 duidt een DELETE-triggerplan aan dat wordt uitgevoerd als resultaat van een MERGE-instructie met een overeenkomstige INSERT- of UPDATE-actie.

Voor geneste triggers die worden uitgevoerd door acties te cascaderen, is deze waarde de actie van de MERGE-instructie die de cascade veroorzaakte.
is_replication_specific int Geeft aan dat de sessie waaruit dit plan is gecompileerd, er een is die verbonden is met de instantie van SQL Server via een niet-gedocumenteerde verbindingseigenschap waarmee de server de sessie kan identificeren als een sessie die is aangemaakt door replicatiecomponenten, zodat het gedrag van bepaalde functionele aspecten van de server wordt aangepast volgens wat die replicatiecomponent verwacht.
optional_spid smallint De verbinding session_id (spid) wordt onderdeel van de cachesleutel om het aantal hercompilaties te verminderen. Dit voorkomt hercompilaties voor het hergebruik van een plan met niet-dynamisch gebonden tijdelijke tabellen in één sessie.
optional_clr_trigger_dbid int Alleen gevuld in het geval van een CLR DML-trigger. De ID van de database die de entiteit bevat.

Voor elk ander objecttype geeft nul terug.
optional_clr_trigger_objid int Alleen gevuld in het geval van een CLR DML-trigger. De object-ID opgeslagen in sys.objects.

Voor elk ander objecttype geeft nul terug.
parent_plan_handle varbinary(64) Altijd NULL.
is_azure_user_plan tinyint 1 voor queries die worden uitgevoerd in een Azure SQL-database vanuit een sessie die door een gebruiker is geïnitieerd.

0 voor quers die zijn uitgevoerd vanuit een sessie die niet door een eindgebruiker is geïnitieerd, maar door applicaties die vanuit de Azure-infrastructuur draaien en queries uitbrengen voor andere doeleinden zoals het verzamelen van telemetrie of het uitvoeren van administratieve taken. Klanten worden niet belast voor middelen die worden verbruikt door zoekopdrachten waarbij is_azure_user_plan = 0 is.

Azure SQL Database only.
inuse_exec_context int Aantal momenteel uitvoerende batches die het queryplan gebruiken.
free_exec_context int Aantal gecachte uitvoeringscontexten voor het queryplan die momenteel niet worden gebruikt.
hits_exec_context int Aantal keren dat de uitvoeringscontext uit de plancache werd gehaald en hergebruikt, waardoor de overhead van het opnieuw compileren van de SQL-instructie werd bespaard. De waarde is een aggregate voor alle batchuitvoeringen tot nu toe.
misses_exec_context int Aantal keren dat een uitvoeringscontext niet in de plancache kon worden gevonden, wat resulteerde in het creëren van een nieuwe uitvoeringscontext voor de batchuitvoering.
removed_exec_context int Aantal uitvoeringscontexten dat is verwijderd vanwege geheugendruk op het gecachte plan.
inuse_cursors int Aantal momenteel uitvoerende batches met één of meer cursors die het gecachte plan gebruiken.
free_cursors int Aantal inactieve of vrije cursors voor het gecachte plan.
hits_cursors int Aantal keren dat een inactieve cursor werd verkregen uit het gecachte plan en hergebruikt. De waarde is een aggregate voor alle batchuitvoeringen tot nu toe.
misses_cursors int Aantal keren dat een inactieve cursor niet in de cache kon worden gevonden.
removed_cursors int Aantal cursors dat is verwijderd vanwege geheugendruk op het gecachte plan.
sql_handle varbinair(64) De SQL-handle voor de batch.

Permissions

Op SQL Server is toestemming vereist VIEW SERVER STATE .

Op Azure SQL Database Basic, S0 en S1 servicedoelstellingen, en voor databases in elastic pools, is het serverbeheeraccount of het Microsoft Entra-beheerdersaccount vereist. Voor alle andere doelstellingen van SQL Database-diensten is de VIEW DATABASE STATE toestemming vereist in de database.

Machtigingen voor SQL Server 2022 en hoger

Vereist de machtiging PRESTATIESTATUS VAN DE WEERGAVESERVER op de server.

Opmerkingen

Opties instellen

Kopieën van hetzelfde samengestelde plan kunnen alleen verschillen door de waarde in de kolom set_options . Dit geeft aan dat verschillende verbindingen verschillende sets SET-opties gebruiken voor dezelfde query. Het gebruik van verschillende sets opties is meestal onwenselijk omdat dit extra compilaties, minder hergebruik van plannen en inflatie van de plancache kan veroorzaken door meerdere kopieën van plannen in de cache.

Setopties evalueren

Om de in set_options teruggegeven waarde te vertalen naar de opties waarmee het plan is samengesteld, trek je de waarden af van de set_options waarde, beginnend met de grootst mogelijke waarde, totdat je 0 bereikt. Elke waarde die je aftrekt komt overeen met een optie die in het queryplan is gebruikt. Als bijvoorbeeld de waarde in set_options 251 is, zijn de opties waarmee het plan is samengesteld ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), Parallel Plan(2) en ANSI_PADDING (1).

Optie Waarde
ANSI_PADDING 1
ParallelPlan

Geeft aan dat de opties voor parallelle planregels zijn veranderd.
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

Geeft aan dat het plan geen werktabel gebruikt om een FOR BROWSE-operatie te implementeren.
512
TriggerOneRow

Geeft aan dat het plan single-row optimalisatie bevat voor AFTER trigger delta-tabellen.
1024
ResyncQuery

Geeft aan dat de query is ingediend door interne systeemopgeslagen procedures.
2048
ARITH_ABORT 4096
NUMERIC_ROUNDABORT 8192
DATEFIRST 16384
DATEFORMAT 32768
LanguageID 65536
OP

Geeft aan dat de databaseoptie PARAMETERISATIE op FORCED stond toen het plan werd samengesteld.
131072
ROWCOUNT Van toepassing op: SQL Server 2012 (11.x) en later

262144

Cursors

Inactieve cursors worden gecachet in een gecompileerd plan zodat het geheugen dat wordt gebruikt om de cursor op te slaan opnieuw kan worden gebruikt door gelijktijdige gebruikers van cursors. Stel bijvoorbeeld dat een batch een cursor declareert en gebruikt zonder deze te dealloceren. Als er twee gebruikers zijn die dezelfde batch uitvoeren, zijn er twee actieve cursors. Zodra de cursors zijn gede-allocated (mogelijk in verschillende batches), wordt het geheugen dat wordt gebruikt om de cursor op te slaan gecachet en niet vrijgegeven. Deze lijst van inactieve cursors wordt bewaard in het samengestelde plan. De volgende keer dat een gebruiker de batch uitvoert, wordt het gecachte cursorgeheugen hergebruikt en op passende wijze geïnitialiseerd als een actieve cursor.

Cursoropties evalueren

Om de in required_cursor_options teruggegeven waarde en acceptable_cursor_options te vertalen naar de opties waarmee het plan is samengesteld, trek je de waarden af van de kolomwaarde, beginnend met de grootst mogelijke waarde, totdat je 0 bereikt. Elke waarde die je aftrekt komt overeen met een cursoroptie die in het queryplan is gebruikt.

Optie Waarde
Geen 0
ONGEVOELIG 1
SCROLLEN 2
ALLEEN-LEZEN 4
VOOR UPDATE 8
LOKAAL 16
GLOBAAL 32
FORWARD_ONLY 64
KEYSET 128
DYNAMISCH 256
SCROLL_LOCKS 512
OPTIMISTISCH 1024
STATISCH 2048
FAST_FORWARD 4096
OP HUN PLAATS 8192
VOOR select_statement 16384

Voorbeelden

Eén. De attributen voor een specifiek plan teruggeven

Het volgende voorbeeld geeft alle planattributen voor een gespecificeerd plan terug. De sys.dm_exec_cached_plans dynamische beheerweergave wordt eerst bevraagd om de planhandle voor het gespecificeerde plan te verkrijgen. In de tweede query vervang <plan_handle> je door een plan handle waarde uit de eerste query.

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. De SET-opties voor gecompileerde plannen en de SQL-handle voor gecachte plannen teruggeven

Het volgende voorbeeld geeft een waarde die de opties vertegenwoordigt waarmee elk plan is samengesteld. Daarnaast wordt de SQL-handle voor alle gecachte plannen teruggegeven.

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  

Zie ook

dynamische beheerweergaven en -functies (Transact-SQL)
uitvoeringsgerelateerde dynamische beheerweergaven en -functies (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.databases (Transact-SQL)
sys.objects (Transact-SQL)