Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso ottenere un piano di esecuzione delle query in SQL Server?

Esistono diversi metodi per ottenere un piano di esecuzione, quale utilizzare dipenderà dalle circostanze. Solitamente è possibile utilizzare SQL Server Management Studio per ottenere un piano, tuttavia se per qualche motivo non è possibile eseguire la query in SQL Server Management Studio, potrebbe essere utile ottenere un piano tramite SQL Server Profiler o ispezionando la cache del piano.

Metodo 1:utilizzo di SQL Server Management Studio

SQL Server viene fornito con un paio di funzionalità che semplificano l'acquisizione di un piano di esecuzione, assicurati semplicemente che la voce di menu "Includi piano di esecuzione effettivo" (che si trova nel menu "Query") sia selezionata ed esegui la query normalmente .

Se stai cercando di ottenere il piano di esecuzione per le istruzioni in una procedura memorizzata, dovresti eseguire la procedura memorizzata, in questo modo:

exec p_Example 42

Al termine della query, nel riquadro dei risultati dovrebbe apparire una scheda aggiuntiva intitolata "Piano di esecuzione". Se hai eseguito molte dichiarazioni, potresti vedere molti piani visualizzati in questa scheda.

Da qui puoi esaminare il piano di esecuzione in SQL Server Management Studio, oppure fare clic con il pulsante destro del mouse sul piano e selezionare "Salva piano di esecuzione con nome..." per salvare il piano in un file in formato XML.

Metodo 2:utilizzo delle opzioni SHOWPLAN

Questo metodo è molto simile al metodo 1 (in effetti questo è ciò che SQL Server Management Studio fa internamente), tuttavia l'ho incluso per completezza o se non hai SQL Server Management Studio disponibile.

Prima di eseguire la query, esegui uno delle seguenti affermazioni. L'istruzione deve essere l'unica istruzione nel batch, ovvero non è possibile eseguire un'altra istruzione contemporaneamente:

SET SHOWPLAN_TEXT ON
SET SHOWPLAN_ALL ON
SET SHOWPLAN_XML ON
SET STATISTICS PROFILE ON
SET STATISTICS XML ON -- The is the recommended option to use

Queste sono opzioni di connessione e quindi è necessario eseguirle solo una volta per connessione. Da questo momento in poi, tutte le istruzioni eseguite saranno accompagnate da un set di risultati aggiuntivo contenente il tuo piano di esecuzione nel formato desiderato:esegui semplicemente la query come faresti normalmente per vedere il piano.

Una volta terminato, puoi disattivare questa opzione con la seguente dichiarazione:

SET <<option>> OFF

Confronto dei formati del piano di esecuzione

A meno che tu non abbia una forte preferenza, la mia raccomandazione è di utilizzare STATISTICS XML opzione. Questa opzione equivale all'opzione "Includi piano di esecuzione effettivo" in SQL Server Management Studio e fornisce la maggior parte delle informazioni nel formato più conveniente.

  • SHOWPLAN_TEXT - Visualizza un piano di esecuzione stimato basato su testo di base, senza eseguire la query
  • SHOWPLAN_ALL - Visualizza un piano di esecuzione stimato basato su testo con stime dei costi, senza eseguire la query
  • SHOWPLAN_XML - Visualizza un piano di esecuzione stimato basato su XML con stime dei costi, senza eseguire la query. Equivale all'opzione "Visualizza piano di esecuzione stimato..." in SQL Server Management Studio.
  • STATISTICS PROFILE - Esegue la query e visualizza un piano di esecuzione effettivo basato su testo.
  • STATISTICS XML - Esegue la query e visualizza un piano di esecuzione effettivo basato su XML. Ciò equivale all'opzione "Includi piano di esecuzione effettivo" in SQL Server Management Studio.

Metodo 3:utilizzo di SQL Server Profiler

Se non puoi eseguire direttamente la tua query (o la tua query non viene eseguita lentamente quando la esegui direttamente - ricorda che desideriamo che un piano della query funzioni male), puoi acquisire un piano usando una traccia di SQL Server Profiler. L'idea è di eseguire la query mentre è in esecuzione una traccia che sta acquisendo uno degli eventi "Showplan".

Tieni presente che a seconda del carico puoi usa questo metodo in un ambiente di produzione, tuttavia dovresti ovviamente usare cautela. I meccanismi di profilatura di SQL Server sono progettati per ridurre al minimo l'impatto sul database, ma ciò non significa che non ce ne saranno nessun impatto sulle prestazioni. Potresti anche avere problemi a filtrare e identificare il piano corretto nella tua traccia se il tuo database è molto utilizzato. Dovresti ovviamente verificare con il tuo DBA per vedere se sono contenti che tu lo faccia nel loro prezioso database!

  1. Apri SQL Server Profiler e crea una nuova traccia connettendoti al database desiderato su cui desideri registrare la traccia.
  2. Nella scheda "Selezione eventi" seleziona "Mostra tutti gli eventi", seleziona la riga "Prestazioni" -> "Showplan XML" ed esegui la traccia.
  3. Mentre la traccia è in esecuzione, fai tutto il necessario per eseguire la query a esecuzione lenta.
  4. Attendere il completamento della query e interrompere la traccia.
  5. Per salvare la traccia, fai clic con il pulsante destro del mouse sull'xml del piano in SQL Server Profiler e seleziona "Estrai i dati dell'evento..." per salvare il piano in un file in formato XML.

Il piano che ottieni equivale all'opzione "Includi piano di esecuzione effettivo" in SQL Server Management Studio.

Metodo 4 - Ispezione della cache delle query

Se non puoi eseguire direttamente la tua query e non riesci nemmeno ad acquisire una traccia del profiler, puoi comunque ottenere un piano stimato ispezionando la cache del piano di query SQL.

Esaminiamo la cache dei piani eseguendo query sui DMV di SQL Server. Quella che segue è una query di base che elencherà tutti i piani di query memorizzati nella cache (come xml) insieme al loro testo SQL. Sulla maggior parte dei database dovrai anche aggiungere ulteriori clausole di filtraggio per filtrare i risultati fino ai piani che ti interessano.

SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)

Esegui questa query e fai clic sull'XML del piano per aprire il piano in una nuova finestra:fai clic con il pulsante destro del mouse e seleziona "Salva piano di esecuzione con nome..." per salvare il piano in un file in formato XML.

Note:

Poiché sono coinvolti così tanti fattori (che vanno dalla tabella e dallo schema dell'indice fino ai dati archiviati e alle statistiche della tabella), dovresti sempre prova a ottenere un piano di esecuzione dal database che ti interessa (normalmente quello che sta riscontrando un problema di prestazioni).

Non è possibile acquisire un piano di esecuzione per stored procedure crittografate.

Piani di esecuzione "effettivi" vs "stimati"

Un reale piano di esecuzione è quello in cui SQL Server esegue effettivamente la query, mentre un stimato piano di esecuzione SQL Server calcola cosa sarebbe fare a meno di eseguire la query. Sebbene logicamente equivalente, un piano di esecuzione effettivo è molto più utile in quanto contiene dettagli e statistiche aggiuntivi su ciò che è effettivamente accaduto durante l'esecuzione della query. Ciò è essenziale quando si diagnosticano problemi in cui le stime di SQL Servers non sono corrette (ad esempio quando le statistiche non sono aggiornate).

  • Piano di esecuzione stimato ed effettivo rivisto

Come interpreto un piano di esecuzione di query?

Questo è un argomento abbastanza degno per un libro (gratuito) a sé stante.

Vedi anche:

  • Nozioni di base sul piano di esecuzione
  • Autorizzazione SHOWPLAN e batch Transact-SQL
  • SQL Server 2008:utilizzo di hash di query e hash del piano di query
  • Analisi della cache dei piani di SQL Server