sys.dm_exec_query_plan (Transact-SQL)

Si applica a:SQL ServerDatabase SQL diAzure Istanza gestita di SQL di Azure

Restituisce il piano Showplan in formato XML per il batch specificato dall'handle di piano. Il piano specificato tramite l'handle di piano può essere memorizzato nella cache o in esecuzione.

Lo schema XML per Showplan viene pubblicato e disponibile in questo sito Web Microsoft. È disponibile anche nella directory in cui è installato SQL Server.

Convenzioni di sintassi Transact-SQL

Sintassi

sys.dm_exec_query_plan(plan_handle)  

Argomenti

plan_handle
Token che identifica in modo univoco un piano di esecuzione di query per un batch eseguito e il relativo piano risiede nella cache dei piani o è attualmente in esecuzione. plan_handle è varbinary(64).

Il plan_handle può essere ottenuto dagli oggetti a gestione dinamica seguenti:

Tabella restituita

Nome colonna Tipo di dati Descrizione
dbid smallint ID del database di contesto in vigore quando è stata compilata l'istruzione Transact-SQL corrispondente a questo piano. Per istruzioni SQL ad hoc e preparate, l'ID del database in cui sono state compilate le istruzioni.

La colonna ammette i valori Null.
objectid int ID dell'oggetto (ad esempio, stored procedure o funzione definita dall'utente) per il piano della query. Per i batch ad hoc e preparati, questa colonna è Null.

La colonna ammette i valori Null.
number smallint Valore intero della stored procedure numerata. Ad esempio, un gruppo di procedure per l'applicazione degli ordini può essere denominato orderproc;1, orderproc;2 e così via. Per i batch ad hoc e preparati, questa colonna è Null.

La colonna ammette i valori Null.
Crittografato bit Indica se la stored procedure corrispondente è crittografata.

0 = non crittografata

1 = crittografata

La colonna non ammette i valori Null.
Query_plan xml Contiene la rappresentazione Showplan in fase di compilazione del piano di esecuzione della query specificato con plan_handle. La rappresentazione Showplan è in formato XML. Viene generato un piano per ogni batch che contiene, ad esempio istruzioni Transact-SQL ad hoc, chiamate di stored procedure e chiamate di funzione definite dall'utente.

La colonna ammette i valori Null.

Osservazioni:

Nelle condizioni seguenti non viene restituito alcun output Showplan nella colonna query_plan della tabella restituita per sys.dm_exec_query_plan:

  • Se il piano di query specificato tramite plan_handle è stato rimosso dalla cache dei piani, la colonna query_plan della tabella restituita è Null. Ad esempio, questa condizione può verificarsi se si verifica un ritardo di tempo tra l'acquisizione dell'handle del piano e il momento in cui è stato usato con sys.dm_exec_query_plan.

  • Alcune istruzioni Transact-SQL non vengono memorizzate nella cache, ad esempio istruzioni o istruzioni per operazioni bulk contenenti valori letterali stringa superiori a 8 KB. Gli showplan XML per tali istruzioni non possono essere recuperati utilizzando sys.dm_exec_query_plan a meno che il batch non sia attualmente in esecuzione perché non esistono nella cache.

  • Se un batch Transact-SQL o una stored procedure contiene una chiamata a una funzione definita dall'utente o una chiamata a SQL dinamico, ad esempio tramite EXEC (stringa), lo showplan XML compilato per la funzione definita dall'utente non è incluso nella tabella restituita da sys.dm_exec_query_plan per il batch o la stored procedure. È invece necessario effettuare una chiamata separata a sys.dm_exec_query_plan per l'handle di piano che corrisponde alla funzione definita dall'utente.

Quando una query ad hoc usa parametrizzazione semplice o forzata, la colonna query_plan conterrà solo il testo dell'istruzione e non il piano di query effettivo. Per restituire il piano di query, chiamare sys.dm_exec_query_plan per l'handle di piano della query con parametri preparata. È possibile determinare se la query è stata parametrizzata facendo riferimento alla colonna sql della vista sys.syscacheobjects o alla colonna di testo della sys.dm_exec_sql_text vista a gestione dinamica.

Nota

A causa di una limitazione del numero di livelli annidati consentiti nel tipo di dati xml , sys.dm_exec_query_plan non può restituire piani di query che soddisfano o superano 128 livelli di elementi annidati. Nelle versioni precedenti di SQL Server questa condizione impediva la restituzione del piano di query e genera l'errore 6335. In SQL Server 2005 (9.x) Service Pack 2 e versioni successive la colonna query_plan restituisce NULL.
È possibile usare la funzione di gestione dinamica sys.dm_exec_text_query_plan (Transact-SQL) per restituire l'output del piano di query in formato testo.

Autorizzazioni

Per eseguire sys.dm_exec_query_plan, un utente deve essere membro del ruolo predefinito del server sysadmin o disporre dell'autorizzazione VIEW SERVER STATE per il server.

Autorizzazioni per SQL Server 2022 e versioni successive

È richiesta l'autorizzazione VIEW SERVER PERFORMANCE STATE nel server.

Esempi

Gli esempi seguenti illustrano come usare la vista a gestione dinamica sys.dm_exec_query_plan .

Per visualizzare gli showplan XML, eseguire le query seguenti nell'editor di query di SQL Server Management Studio, quindi fare clic su ShowPlanXML nella colonna query_plan della tabella restituita da sys.dm_exec_query_plan. Lo showplan XML viene visualizzato nel riquadro di riepilogo di Management Studio. Per salvare lo showplan XML in un file, fare clic con il pulsante destro del mouse su ShowPlanXML nella colonna query_plan, scegliere Salva risultati con nome, denominare il file nel formato <file_name.sqlplan>, ad esempio MyXMLShowplan.sqlplan.

R. Recupero del piano di query memorizzato nella cache per un query o un batch Transact-SQL con esecuzione prolungata

I piani di query per vari tipi di batch Transact-SQL, ad esempio batch ad hoc, stored procedure e funzioni definite dall'utente, vengono memorizzati nella cache in un'area di memoria denominata cache dei piani. Ogni piano della query memorizzato nella cache è identificato da un ID univoco denominato handle del piano. È possibile specificare questo handle di piano con la vista a gestione dinamica sys.dm_exec_query_plan per recuperare il piano di esecuzione per una determinata query o batch Transact-SQL.

Se una query Transact-SQL o un batch viene eseguito a lungo in una determinata connessione a SQL Server, recuperare il piano di esecuzione per tale query o batch per individuare la causa del ritardo. Nell'esempio seguente viene illustrato come recuperare il piano Showplan XML per una query o un batch con esecuzione prolungata.

Nota

Per eseguire questo esempio, sostituire i valori per session_id e plan_handle con valori specifici del server.

Utilizzare innanzitutto la stored procedure sp_who per recuperare l'ID del processo server (SPID, Server Process ID) per il processo che esegue la query o il batch:

USE master;  
GO  
exec sp_who;  
GO  

Il set dei risultati restituito da sp_who indica che il valore di SPID è 54. È possibile utilizzare questo SPID con la vista a gestione dinamica sys.dm_exec_requests per recuperare l'handle del piano utilizzando la query seguente:

USE master;  
GO  
SELECT * FROM sys.dm_exec_requests  
WHERE session_id = 54;  
GO  

La tabella restituita da sys.dm_exec_requests indica che l'handle di piano per la query o il batch a esecuzione lenta è 0x06000100A27E7C1FA821B10600, che è possibile specificare come argomento plan_handle con sys.dm_exec_query_plan per recuperare il piano di esecuzione in formato XML come indicato di seguito. Il piano di esecuzione in formato XML per la query o il batch a esecuzione lenta è contenuto nella colonna query_plan della tabella restituita da sys.dm_exec_query_plan.

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_query_plan (0x06000100A27E7C1FA821B10600);  
GO  

B. Recupero di tutti i piani di query dalla cache dei piani

Per recuperare uno snapshot di tutti i piani di query disponibili nella cache dei piani, è possibile recuperare gli handle per tutti i piani di query nella cache eseguendo una query sulla vista a gestione dinamica sys.dm_exec_cached_plans. Gli handle dei piani sono archiviati nella colonna plan_handle della vista sys.dm_exec_cached_plans. È quindi necessario utilizzare l'operatore CROSS APPLY per passare gli handle dei piani a sys.dm_exec_query_plan come illustrato di seguito. L'output Showplan XML per ogni piano disponibile nella cache dei piani viene indicato nella colonna query_plan della tabella restituita.

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);  
GO  

C. Recupero di tutti i piani di query per cui sono state raccolte informazioni statistiche sulle query dalla cache dei piani da parte del server

Per recuperare uno snapshot di tutti i piani di query disponibili nella cache dei piani per i quali il server ha raccolto informazioni statistiche, è possibile recuperare gli handle dei piani per tutti i piani di query nella cache eseguendo una query sulla vista a gestione dinamica sys.dm_exec_query_stats. Gli handle dei piani sono archiviati nella colonna plan_handle della vista sys.dm_exec_query_stats. È quindi necessario utilizzare l'operatore CROSS APPLY per passare gli handle dei piani a sys.dm_exec_query_plan come illustrato di seguito. L'output Showplan XML per ogni piano disponibile nella cache dei piani per cui il server ha raccolto informazioni statistiche viene indicato nella colonna query_plan della tabella restituita.

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle);  
GO  

D. Recupero di informazioni sulle prime cinque query in base al tempo medio di CPU

Nell'esempio seguente vengono restituiti i piani e il tempo medio di CPU per le prime cinque query.

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],  
   plan_handle, query_plan   
FROM sys.dm_exec_query_stats AS qs  
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)  
ORDER BY total_worker_time/execution_count DESC;  
GO  

Vedi anche

Funzioni e viste a gestione dinamica (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.dm_exec_query_stats (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sp_who (Transact-SQL)
Guida di riferimento a operatori Showplan logici e fisici
sys.dm_exec_text_query_plan (Transact-SQL)