SET SHOWPLAN_ALL (Transact-SQL)
Impedisce l'esecuzione delle istruzioni Transact-SQL in Microsoft SQL Server. SQL Server restituisce invece informazioni dettagliate sulla modalità di esecuzione delle istruzioni e una stima delle risorse necessarie per eseguire le istruzioni.
Sintassi
SET SHOWPLAN_ALL { ON | OFF }
Osservazioni
L'opzione SET SHOWPLAN_ALL viene impostata in fase di esecuzione, non in fase di analisi.
Quando l'opzione SET SHOWPLAN_ALL è impostata su ON, SQL Server restituisce le informazioni di esecuzione per ciascuna istruzione, senza eseguirla. Le istruzioni Transact-SQL non vengono eseguite. Quando l'opzione è impostata su ON, vengono restituite informazioni su tutte le istruzioni Transact-SQL successive fino a quando l'opzione non viene reimpostata su OFF. Se, ad esempio, si esegue un'istruzione CREATE TABLE quando l'opzione SET SHOWPLAN_ALL è impostata su ON, SQL Server restituisce un messaggio di errore di una successiva istruzione SELECT che interessa la stessa tabella, per informare gli utenti che la tabella specificata non esiste. I successivi riferimenti a tale tabella pertanto hanno esito negativo. Quando l'opzione SET SHOWPLAN_ALL è impostata su OFF, le istruzioni vengono eseguite da SQL Server senza la generazione di alcun report.
L'opzione SET SHOWPLAN_ALL è stata creata specificatamente per l'utilizzo in applicazioni per la gestione dell'output. Utilizzare SET SHOWPLAN_TEXT per ottenere output leggibile in applicazioni della riga di comando per Microsoft Win 32, ad esempio l'utilità osql.
Non è possibile specificare entrambe le opzioni SET SHOWPLAN_TEXT e SET SHOWPLAN_ALL in una stored procedure. Devono essere inoltre le uniche istruzioni di un batch.
L'opzione SET SHOWPLAN_ALL restituisce informazioni sotto forma di un set di righe in un albero gerarchica che rappresenta i passaggi eseguiti da Query Processor di SQL Server per l'esecuzione delle varie istruzioni. Ogni istruzione restituita nell'output include una singola riga contenente il testo dell'istruzione seguita da alcune righe che includono i dettagli dei passaggi dell'esecuzione. Nella tabella seguente vengono illustrate le colonne incluse nell'output.
Nome colonna |
Descrizione |
---|---|
StmtText |
Per righe che non sono di tipo PLAN_ROW, questa colonna include il testo dell'istruzione Transact-SQL. Per righe di tipo PLAN_ROW, include una descrizione dell'operazione. La colonna include l'operatore fisico e facoltativamente l'operatore logico. Può essere inoltre seguita da una descrizione determinata dall'operatore fisico. Per ulteriori informazioni, vedere Guida di riferimento agli operatori logici e fisici. |
StmtId |
Numero dell'istruzione nel batch corrente. |
NodeId |
ID del nodo nella query corrente. |
Parent |
ID del nodo del passaggio padre. |
PhysicalOp |
Algoritmo di implementazione fisica del nodo. Solo per righe di tipo PLAN_ROWS. |
LogicalOp |
Operatore algebrico relazionale rappresentato dal nodo. Solo per righe di tipo PLAN_ROWS. |
Argomento |
Offre informazioni aggiuntive sull'operazione che viene eseguita. Il contenuto di questa colonna dipende dall'operatore fisico. |
DefinedValues |
Include un elenco delimitato da virgole dei valori introdotti da questo operatore. Tali valori possono essere espressioni calcolate che erano incluse nella query corrente, ad esempio nell'elenco di selezione o nella clausola WHERE, oppure valori interni inseriti da Query Processor per l'elaborazione della query. È inoltre possibile fare riferimento a tali valori in un altro punto della query. Solo per righe di tipo PLAN_ROWS. |
EstimateRows |
Numero stimato di righe restituite dall'operatore. Solo per righe di tipo PLAN_ROWS. |
EstimateIO |
Costo* di I/O stimato per l'operatore. Solo per righe di tipo PLAN_ROWS. |
EstimateCPU |
Costo* della CPU stimato per l'operatore. Solo per righe di tipo PLAN_ROWS. |
AvgRowSize |
Dimensioni medie stimate (in byte) della riga che viene elaborata dall'operatore. |
TotalSubtreeCost |
Costo* (cumulativo) stimato dell'operazione e delle operazioni figlio. |
OutputList |
Include un elenco delimitato da virgole delle colonne previste dall'operazione corrente. |
Warnings |
Include un elenco delimitato da virgole dei messaggi di avviso relativi all'operazione corrente. I messaggi di avviso possono includere la stringa "NO STATS:()" con un elenco di colonne. Tale messaggio indica che in Query Optimizer è stata tentata una decisione in base alle statistiche di questa colonna, ma non era disponibile alcuna statistica. Query Optimizer ha pertanto formulato un'ipotesi con cui potrebbe essere stato scelto un piano non efficiente per la query. Per ulteriori informazioni sulla creazione o l'aggiornamento di statistiche di colonna, che agevolano la scelta di un piano per la query più efficace da parte di Query Optimizer, vedere UPDATE STATISTICS. Questa colonna può includere facoltativamente la stringa "MISSING JOIN PREDICATE", a indicare che è stato eseguito un join tra tabelle senza specificare un predicato di join. In seguito all'eliminazione accidentale di un predicato di join, la query potrebbe richiedere tempi di esecuzione maggiori del previsto e restituire un set di risultati di dimensioni elevate. Se la colonna include tale stringa, verificare se l'assenza di un predicato di join è o meno voluta. |
Type |
Tipo di nodo. Per il nodo padre di ogni query, è il tipo di istruzione Transact-SQL, ad esempio SELECT, INSERT, EXECUTE e così via. Per sottonodi che rappresentano piani di esecuzione, il tipo è PLAN_ROW. |
Parallel |
0 = L'operatore non viene eseguito in parallelo. 1 = L'operatore viene eseguito in parallelo. |
EstimateExecutions |
Numero stimato di esecuzioni dell'operatore durante l'elaborazione della query corrente. |
*Le unità di costo sono basate su una misurazione interna del tempo, non sul tempo dell'orologio. Si utilizzano per la determinazione del costo relativo di un piano rispetto ad altri piani.
Autorizzazioni
Per poter utilizzare SET SHOWPLAN_ALL, è necessario disporre delle autorizzazioni sufficienti per eseguire le istruzioni in cui SET SHOWPLAN_ALL viene eseguito, nonché l'autorizzazione SHOWPLAN per tutti i database contenenti oggetti di riferimento.
Per poter generare uno Showplan con le istruzioni SELECT, INSERT, UPDATE, DELETE, EXEC stored_procedure e EXEC user_defined_function, l'utente deve disporre di:
Autorizzazioni appropriate per l'esecuzione delle istruzioni Transact-SQL.
Autorizzazione SHOWPLAN su tutti i database contenenti oggetti a cui fanno riferimento le istruzioni Transact-SQL, ad esempio tabelle, viste e così via.
Per tutte le altre istruzioni, ad esempio DDL, USE database_name, SET, DECLARE, SQL dinamico, e così via, sono necessarie soltanto le autorizzazioni necessarie per eseguire le istruzioni Transact-SQL.
Per ulteriori informazioni, vedere Aspetti di protezione relativi a Showplan e Autorizzazione SHOWPLAN e batch di comandi Transact-SQL.
Esempi
Nelle due istruzioni seguenti vengono utilizzate le impostazioni dell'opzione SET SHOWPLAN_ALL per illustrare l'analisi e l'ottimizzazione dell'utilizzo degli indici nelle query in SQL Server.
La prima query utilizza l'operatore di confronto uguale a (=) nella clausola WHERE in una colonna indicizzata. Il risultato è il valore Clustered Index Seek nella colonna LogicalOp e il nome dell'indice nella colonna Argument.
La seconda query utilizza l'operatore LIKE nella clausola WHERE. In tal modo viene imposta l'esecuzione di una scansione di indice cluster in SQL Server per individuare i dati che soddisfano la condizione della clausola WHERE. Il risultato è il valore Clustered Index Scan nella colonna LogicalOp con il nome dell'indice nella colonna Argument e il valore Filter nella colonna LogicalOp con la condizione della clausola WHERE nella colonna Argument.
I valori nelle colonne EstimateRows e TotalSubtreeCost della prima query indicizzata sono inferiori, a indicare che la query è stata elaborata molto più rapidamente con un numero di risorse inferiore rispetto alla query non indicizzata.
USE AdventureWorks;
GO
SET SHOWPLAN_ALL ON;
GO
-- First query.
SELECT EmployeeID
FROM HumanResources.Employee
WHERE NationalIDNumber = '509647174';
GO
-- Second query.
SELECT EmployeeID, EmergencyContactID
FROM HumanResources.Employee
WHERE EmergencyContactID LIKE '1%';
GO
SET SHOWPLAN_ALL OFF;
GO