Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich die teuersten Abfragen protokollieren und finden?

  1. Verwenden Sie SQL Server Profiler (im Menü „Extras“ in SSMS), um eine Ablaufverfolgung zu erstellen, die diese Ereignisse protokolliert:

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. Sie können mit der Standardablaufverfolgungsvorlage beginnen und diese beschneiden. Sie haben nicht angegeben, ob dies für eine bestimmte Datenbank oder den gesamten Server gilt. Wenn es sich um bestimmte Datenbanken handelt, fügen Sie die DatabaseID-Spalte hinzu und setzen Sie einen Filter auf Ihre Datenbank (SELECT DB_ID('dbname') ). Stellen Sie sicher, dass die logische Datenspalte „Reads“ für jedes Ereignis enthalten ist. Stellen Sie den Trace so ein, dass er in einer Datei protokolliert wird. Wenn Sie diesen Trace unbeaufsichtigt im Hintergrund laufen lassen, ist es eine gute Idee, eine maximale Trace-Dateigröße festzulegen, sagen wir 500 MB oder 1 GB, wenn Sie genügend Platz haben (es hängt alles davon ab, wie viel Aktivität auf dem Server vorhanden ist, also Sie müssen es lutschen und sehen).

  3. Starten Sie den Trace kurz und pausieren Sie ihn dann. Gehen Sie zu File->Export->Script Trace Definition und wählen Sie Ihre DB-Version aus und speichern Sie sie in einer Datei. Sie haben jetzt ein SQL-Skript, das eine Ablaufverfolgung erstellt, die viel weniger Overhead hat als die Ausführung über die Profiler-GUI. Wenn Sie dieses Skript ausführen, gibt es die Trace-ID aus (normalerweise @ID=2 ); Notieren Sie sich das.

  4. Sobald Sie eine Ablaufverfolgungsdatei (.trc) haben (entweder die Ablaufverfolgung wurde abgeschlossen, weil die maximale Dateigröße erreicht wurde, oder Sie haben die laufende Ablaufverfolgung mit

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

Sie können den Trace in den Profiler laden oder ClearTrace (sehr praktisch) verwenden oder ihn wie folgt in eine Tabelle laden:

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

Dann können Sie eine Abfrage ausführen, um die Daten wie diese zu aggregieren:

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

Sobald Sie die kostspieligen Abfragen identifiziert haben, können Sie die eigentlichen Ausführungspläne erstellen und untersuchen.