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

Come posso accedere e trovare le query più costose?

  1. Utilizzare SQL Server Profiler (nel menu degli strumenti in SSMS) per creare una traccia che registri questi eventi:

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. Puoi iniziare con il modello di traccia standard e potarlo. Non hai specificato se si trattava di un database specifico o dell'intero server, se è per Db specifici, includi la colonna DatabaseID e imposta un filtro sul tuo DB (SELECT DB_ID('dbname') ). Assicurati che la colonna dei dati logici Reads sia inclusa per ogni evento. Imposta la traccia per accedere a un file. Se stai lasciando questa traccia in esecuzione incustodita in background, è una buona idea impostare una dimensione massima del file di traccia, ad esempio 500 MB o 1 GB se hai molto spazio (tutto dipende da quanta attività c'è sul server, quindi dovrai succhiarlo e vedere).

  3. Avviare brevemente la traccia e quindi metterla in pausa. Vai su File->Esporta->Definizione traccia script e scegli la versione del tuo DB e salva in un file. Ora hai uno script sql che crea una traccia con un sovraccarico molto inferiore rispetto all'esecuzione tramite la GUI del profiler. Quando esegui questo script, verrà restituito l'ID di traccia (di solito @ID=2 ); annotalo.

  4. Una volta che hai un file di traccia (.trc) (la traccia è stata completata per aver raggiunto la dimensione massima del file o hai interrotto la traccia in esecuzione utilizzando

    EXEC sp_trace_setstatus @ID, 0
    EXEC sp_trace_setstatus @ID, 2

Puoi caricare la traccia nel profiler o utilizzare ClearTrace (molto utile) o caricarla in una tabella in questo modo:

SELECT * INTO TraceTable
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)

Quindi puoi eseguire una query per aggregare i dati come questo:

SELECT COUNT(*) AS TotalExecutions, 
    EventClass, CAST(TextData as nvarchar(2000))
 ,SUM(Duration) AS DurationTotal
 ,SUM(CPU) AS CPUTotal
 ,SUM(Reads) AS ReadsTotal
 ,SUM(Writes) AS WritesTotal
FROM TraceTable
GROUP BY EventClass, CAST(TextData as nvarchar(2000))
ORDER BY ReadsTotal DESC

Dopo aver identificato le query costose, puoi generare ed esaminare i piani di esecuzione effettivi.