Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2016 (13.x) en latere versies
Azure SQL Database
Azure SQL Managed Instance
SQL 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)