sys.dm_exec_plan_attributes (Transact-SQL)
Si applica a: SQL Server
Restituisce una riga per ogni attributo del piano specificato dall'handle di piano. È possibile utilizzare questa funzione con valori di tabella per recuperare informazioni dettagliate su un particolare piano, come i valori di chiave nella cache o il numero corrente di esecuzioni simultanee del piano.
Nota
Alcune delle informazioni restituite tramite questa funzione sono mappate alla vista di compatibilità con le versioni precedenti di sys.syscacheobjects .
Sintassi
sys.dm_exec_plan_attributes ( plan_handle )
Argomenti
plan_handle
Viene identificato in modo univoco un piano di query per un batch eseguito il cui piano risiede nella cache dei piani. plan_handle is varbinary(64). L'handle di piano può essere ottenuto dalla vista a gestione dinamica sys.dm_exec_cached_plans .
Tabella restituita
Nome colonna | Tipo di dati | Descrizione |
---|---|---|
Attributo | varchar(128) | Nome dell'attributo associato al piano. La tabella immediatamente sotto questa elenca gli attributi possibili, i relativi tipi di dati e le relative descrizioni. |
value | sql_variant | Valore dell'attributo associato al piano. |
is_cache_key | bit | Indica se l'attributo viene utilizzato come parte della chiave di ricerca nella cache per il piano. |
Dalla tabella precedente, l'attributo può avere i valori seguenti:
Attributo | Tipo di dati | Descrizione |
---|---|---|
set_options | int | Indica i valori delle opzioni con cui è stato compilato il piano. |
objectid | int | Una delle chiavi principali utilizzate per la ricerca di un oggetto nella cache. Si tratta dell'ID oggetto archiviato in sys.objects per gli oggetti di database (procedure, viste, trigger e così via). Per i piani di tipo ad hoc o preparati, questo attributo corrisponde a un hash interno del testo del batch. |
dbid | int | ID del database contenente l'entità alla quale fa riferimento il piano. Per i piani ad hoc o preparati, corrisponde all'ID del database da cui viene eseguito il batch. |
dbid_execute | int | Per gli oggetti di sistema archiviati nel database delle risorse , l'ID del database da cui viene eseguito il piano memorizzato nella cache. In tutti gli altri casi è 0. |
user_id | int | Il valore -2 indica che il batch inviato non dipende dalla risoluzione implicita del nome e può essere condiviso da diversi utenti. Questo è il metodo preferito. Qualsiasi altro valore rappresenta l'ID dell'utente che invia la query al database. |
language_id | smallint | ID della lingua della connessione in cui è stato creato l'oggetto della cache. Per altre informazioni, vedere sys.syslanguages (Transact-SQL). |
date_format | smallint | Formato della data della connessione in cui è stato creato l'oggetto della cache. Per altre informazioni, vedere SET DATEFORMAT (Transact-SQL). |
date_first | tinyint | Primo valore di data. Per altre informazioni, vedere SET DATEFIRST (Transact-SQL). |
compat_level | tinyint | Rappresenta il livello di compatibilità impostato nel database nel cui contesto è stato compilato il piano di query. Il livello di compatibilità restituito è il livello di compatibilità del contesto di database corrente per le istruzioni ad hoc e non è interessato dall'hint per la query QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n. Per le istruzioni contenute in una stored procedure o una funzione corrisponde al livello di compatibilità del database in cui viene creata la stored procedure o la funzione. |
stato | int | Bit di stato interni che fanno parte della chiave di ricerca nella cache. |
required_cursor_options | int | Opzioni di cursore specificate dall'utente, ad esempio il tipo di cursore. |
acceptable_cursor_options | int | Le opzioni del cursore che SQL Server può convertire in modo implicito per supportare l'esecuzione dell'istruzione. Ad esempio, l'utente potrebbe specificare un cursore dinamico, ma Query Optimizer è autorizzato a convertire questo tipo di cursore in un cursore statico. |
merge_action_type | smallint | Il tipo di piano di esecuzione del trigger utilizzato come risultato di un'istruzione MERGE. 0 indicano un piano non-trigger, un piano del trigger che non viene eseguito come risultato di un'istruzione MERGE o un piano del trigger che viene eseguito come risultato di un'istruzione MERGE in cui viene specificata solo un'azione DELETE. 1 indica un piano di trigger INSERT che è in esecuzione come risultato di un'istruzione MERGE. 2 indica un piano di trigger UPDATE in esecuzione come risultato di un'istruzione MERGE. 3 indica un piano di trigger DELETE che viene eseguito come risultato di un'istruzione MERGE che contiene un'azione INSERT o UPDATE corrispondente. Per i trigger nidificati eseguiti da azioni a catena, questo valore è l'azione dell'istruzione MERGE che provoca la propagazione. |
is_replication_specific | int | Rappresenta che la sessione da cui è stato compilato questo piano è una che è connessa all'istanza di SQL Server usando una proprietà di connessione non documentata che consente al server di identificare la sessione come creata dai componenti di replica, in modo che il comportamento di determinati aspetti funzionali del server venga modificato in base a quanto previsto da tale componente di replica. |
optional_spid | smallint | La connessione session_id (spid) diventa parte della chiave della cache per ridurre il numero di ricompilato. Ciò impedisce la ricompilazione per il riutilizzo di una singola sessione di un piano che include tabelle temporanee non associate dinamicamente. |
optional_clr_trigger_dbid | int | Popolato solo nel caso di un trigger CLR DML. ID del database contenente l'entità. Per qualsiasi altro tipo di oggetto, restituisce zero. |
optional_clr_trigger_objid | int | Popolato solo nel caso di un trigger CLR DML. ID oggetto archiviato in sys.objects. Per qualsiasi altro tipo di oggetto, restituisce zero. |
parent_plan_handle | varbinary(64) | Sempre NULL. |
is_azure_user_plan | tinyint | 1 per le query eseguite in un database SQL di Azure da una sessione avviata da un utente. 0 per le query eseguite da una sessione non avviata da un utente finale, ma da applicazioni in esecuzione dall'infrastruttura di Azure che eseguono query per altri scopi di raccolta dei dati di telemetria o esecuzione di attività amministrative. I clienti non vengono addebitati costi per le risorse utilizzate dalle query in cui is_azure_user_plan = 0. solo database SQL di Azure. |
inuse_exec_context | int | Numero di batch in esecuzione che utilizzano il piano di query. |
free_exec_context | int | Numero di contesti di esecuzione memorizzati nella cache per il piano di query, attualmente inutilizzati. |
hits_exec_context | int | Numero di riutilizzi del contesto di esecuzione recuperato dalla cache dei piani, con conseguente risparmio dell'overhead correlato alla ricompilazione dell'istruzione SQL. Il valore rappresenta un'aggregazione per tutti i batch eseguiti finora. |
misses_exec_context | int | Numero di volte in cui non è stato possibile trovare un contesto di esecuzione nella cache dei piani, con conseguente creazione di un nuovo contesto di esecuzione per l'esecuzione del batch. |
removed_exec_context | int | Numero di contesti di esecuzione rimossi a causa di richieste di memoria eccessive per il piano memorizzato nella cache. |
inuse_cursors | int | Numero di batch in esecuzione che contengono uno o più cursori che utilizzano il piano memorizzato nella cache. |
free_cursors | int | Numero di cursori inattivi o liberi per il piano memorizzato nella cache. |
hits_cursors | int | Numero di riutilizzi di un cursore inattivo ottenuto dal piano memorizzato nella cache. Il valore rappresenta un'aggregazione per tutti i batch eseguiti finora. |
misses_cursors | int | Numero di volte in cui non è stato possibile trovare un cursore inattivo nella cache. |
removed_cursors | int | Numero di cursori rimossi a causa di richieste di memoria eccessive per il piano memorizzato nella cache. |
sql_handle | varbinary(64) | Handle SQL per il batch. |
Autorizzazioni
In SQL Server è richiesta VIEW SERVER STATE
l'autorizzazione.
In database SQL di Azure obiettivi di servizio Basic, S0 e S1 e per i database nei pool elastici, è necessario l'account amministratore del server o l'account amministratore di Microsoft Entra. Per tutti gli altri obiettivi di servizio database SQL, l'autorizzazione VIEW DATABASE STATE
è necessaria nel database.
Autorizzazioni per SQL Server 2022 e versioni successive
È richiesta l'autorizzazione VIEW SERVER PERFORMANCE STATE per il server.
Osservazioni:
Opzioni SET
Le copie dello stesso piano compilato possono differire solo per il valore nella colonna set_options . Ciò indica che connessioni diverse utilizzano set di opzioni SET diversi per la stessa query. L'utilizzo di set diversi di opzioni è in genere poco consigliabile perché può causare compilazioni aggiuntive, un minore riutilizzo del piano e un aumento delle dimensioni della cache dei piani in seguito alla presenza di più copie dei piani.
Valutazione delle opzioni SET
Per convertire il valore restituito in set_options alle opzioni con cui è stato compilato il piano, sottrarre i valori dal valore set_options , a partire dal valore più grande possibile, fino a raggiungere 0. Ogni valore sottratto corrisponde a un'opzione utilizzata nel piano di query. Ad esempio, se il valore in set_options è 251, le opzioni con cui è stato compilato il piano sono ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), Piano parallelo (2) e ANSI_PADDING (1).
Opzione | Valore |
---|---|
ANSI_PADDING | 1 |
ParallelPlan Indica che le opzioni di parallelismo del piano sono state modificate. |
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 Indica che il piano non utilizza una tabella di lavoro per implementare un'operazione FOR BROWSE. |
512 |
TriggerOneRow Indica che il piano contiene l'ottimizzazione della singola riga per le tabelle delta del trigger AFTER. |
1024 |
ResyncQuery Indica che la query è stata inviata da stored procedure di sistema interne. |
2048 |
ARITH_ABORT | 4096 |
NUMERIC_ROUNDABORT | 8192 |
DATEFIRST | 16384 |
DATEFORMAT | 32768 |
LanguageID | 65536 |
UPON Indica che l'opzione di database PARAMETERIZATION era impostata su FORCED al momento della compilazione del piano. |
131072 |
ROWCOUNT | Si applica a: SQL Server 2012 (11.x) e versioni successive 262144 |
Cursori
I cursori inattivi vengono memorizzati nella cache in un piano compilato in modo che la memoria utilizzata per archiviare il cursore possa essere riutilizzata da utenti simultanei dei cursori. Si supponga, ad esempio, che un batch dichiari e utilizzi un cursore senza deallocarlo. Se due utenti eseguono lo stesso batch, saranno presenti due cursori attivi. Dopo la deallocazione dei cursori, potenzialmente in batch diversi, la memoria utilizzata per archiviare il cursore viene assegnata alla cache e non rilasciata. Questo elenco dei cursori inattivi viene mantenuto nel piano compilato. In occasione della successiva esecuzione del batch, la memoria per il cursore nella cache verrà riutilizzata e inizializzata in modo appropriato come cursore attivo.
Valutazione delle opzioni di cursore
Per convertire il valore restituito in required_cursor_options e acceptable_cursor_options alle opzioni con cui è stato compilato il piano, sottrarre i valori dal valore della colonna, a partire dal valore massimo possibile, fino a raggiungere 0. Ogni valore sottratto corrisponde a un'opzione di cursore utilizzata nel piano di query.
Opzione | Valore |
---|---|
None | 0 |
INSENSITIVE | 1 |
SCROLL | 2 |
READ ONLY | 4 |
FOR UPDATE | 8 |
LOCAL | 16 |
GLOBAL | 32 |
FORWARD_ONLY | 64 |
KEYSET | 128 |
DYNAMIC | 256 |
SCROLL_LOCKS | 512 |
OPTIMISTIC | 1024 |
STATIC | 2048 |
FAST_FORWARD | 4096 |
IN PLACE | 8192 |
FOR select_statement | 16384 |
Esempi
R. Restituzione degli attributi per un piano specifico
Nell'esempio seguente vengono restituiti tutti gli attributi per un piano specificato. Viene prima di tutto eseguita una query sulla vista a gestione dinamica sys.dm_exec_cached_plans
per ottenere l'handle del piano specificato. Nella seconda query, sostituire <plan_handle>
con il valore di handle di piani restituito dalla prima 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. Restituzione delle opzioni SET per i piani compilati e dell'handle SQL per i piani memorizzati nella cache
Nell'esempio seguente viene restituito un valore che rappresenta le opzioni con cui è stato compilato ogni piano. Inoltre, viene restituito l'handle SQL per tutti i piani memorizzati nella cache.
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
Vedi anche
Funzioni a gestione dinamica e DMV (Transact-SQL)
Funzioni e viste a gestione dinamica relative all'esecuzione (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.databases (Transact-SQL)
sys.objects (Transact-SQL)