sys.dm_exec_plan_attributes (Transact-SQL)

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 informazioni restituite da questa funzione corrispondono a quelle disponibili nella vista di compatibilità con le versioni precedenti sys.syscacheobjects.

Sintassi

sys.dm_exec_plan_attributes ( plan_handle )

Argomenti

  • plan_handle
    Identifica in modo univoco un piano di query per un batch eseguito il cui piano risiede nella cache dei piani. plan_handle è di tipo varbinary(64). È possibile ottenere l'handle di piano dalla vista a gestione dinamica sys.dm_exec_cached_plans.

Tabella restituita

Nome colonna

Tipo di dati

Descrizione

attribute

varchar(128)

Nome dell'attributo associato al piano. I valori validi sono:

AttributoTipo di datiDescrizione
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. Corrisponde all'ID di oggetto archiviato nella tabella sys.objects per gli oggetti del 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 Resource, corrisponde all'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. Corrisponde al metodo migliore. 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 ulteriori informazioni, vedere sys.syslanguages (Transact-SQL).
date_format smallint Formato della data della connessione in cui è stato creato l'oggetto della cache. Per ulteriori informazioni, vedere SET DATEFORMAT (Transact-SQL).
date_first tinyint Primo valore di data. Per ulteriori informazioni, vedere SET DATEFIRST (Transact-SQL).
status 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 Opzioni di cursore che potrebbero essere convertite in modo implicito da SQL Server 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. Per ulteriori informazioni, vedere Utilizzo della conversione implicita del cursore.
inuse_exec_context int Numero di batch in esecuzione che utilizzano il piano di query. Per ulteriori informazioni sul contesto di esecuzione e i piani di query, vedere Caching e riutilizzo del piano di esecuzione.
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.
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.

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.

Autorizzazioni

È richiesta l'autorizzazione VIEW SERVER STATE nel server.

Osservazioni

Opzioni SET

Più copie dello stesso piano compilato possono differire solo per il valore nella colonna set_options. Ciò indica che connessioni diverse utilizzano gruppi di opzioni SET diversi per la stessa query. L'utilizzo di gruppi 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. Per ulteriori informazioni, vedere Consigli per l'ottimizzazione delle query.

Valutazione delle opzioni SET

Per convertire il valore restituito nella colonna set_options nelle opzioni utilizzate per compilare il piano, sottrarre i valori dal valore set_options, a partire dal più grande, fino a raggiungere 0. Ogni valore sottratto corrisponde a un'opzione utilizzata nel piano di query. Ad esempio, se la colonna set_options indica il valore 251, le opzioni utilizzate per la compilazione del piano sono ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), Parallel Plan(2) e ANSI_PADDING (1).

Opzione

Valore

ANSI_PADDING

1

Parallel Plan

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

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 nelle opzioni utilizzate per compilare il piano, sottrarre i valori dal valore della colonna, a partire dal più grande, fino a raggiungere 0. Ogni valore sottratto corrisponde a un'opzione di cursore utilizzata nel piano di query.

Opzione

Valore

Nessuna

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

A. 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