it-swarm.com.de

Wie kann ich die teuersten Abfragen protokollieren und finden?

Mit dem Aktivitätsmonitor in sql2k8 können wir die teuersten Abfragen sehen. Ok, das ist cool, aber gibt es eine Möglichkeit, diese Informationen zu protokollieren oder über den Query Analyzer abzurufen? Ich möchte nicht wirklich, dass die SQL-Verwaltungskonsole geöffnet ist und ich das Aktivitätsmonitor-Dashboard anschaue.

Ich möchte herausfinden, welche Abfragen schlecht geschrieben sind/das Schema schlecht ausgelegt ist usw.

Vielen Dank für jede Hilfe!

64
Pure.Krome
  1. Verwenden Sie SQL Server Profiler (im Menü "Tools" 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 Standard-Trace-Vorlage beginnen und sie beschneiden. Sie haben nicht angegeben, ob es sich um eine bestimmte Datenbank oder um den gesamten Server handelt. Wenn es sich um bestimmte Datenbankeinheiten handelt, fügen Sie die Spalte DatabaseID ein und setzen Sie einen Filter für Ihre Datenbank (SELECT DB_ID('dbname')). Stellen Sie sicher, dass die Spalte für das logische Lesen für jedes Ereignis enthalten ist. Legen Sie die Ablaufverfolgung fest, um eine Datei zu protokollieren. Wenn Sie diesen Trace unbeaufsichtigt im Hintergrund ausführen lassen, empfiehlt es sich, eine maximale Trace-Dateigröße festzulegen, z. B. 500 MB oder 1 GB, wenn Sie über ausreichend Speicherplatz verfügen Sie müssen es saugen und sehen).

  3. Starten Sie den Trace kurz und pausieren Sie ihn dann. Gehen Sie zu Datei-> Exportieren-> Skript-Trace-Definition, wählen Sie Ihre DB-Version aus und speichern Sie sie in einer Datei. Sie verfügen jetzt über ein SQL-Skript, das eine Ablaufverfolgung erstellt, die weitaus weniger Aufwand verursacht als das Durchführen der Profiler-Benutzeroberfläche. Wenn Sie dieses Skript ausführen, wird die Trace-ID (normalerweise @ID=2) ausgegeben. notieren Sie sich dies.

  4. Sobald Sie eine Trace-Datei (.trc) haben (entweder wurde der Trace aufgrund des Erreichens der maximalen Dateigröße abgeschlossen oder Sie haben den laufenden Trace mit beendet.)

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

Sie können die Ablaufverfolgung in Profiler laden oder ClearTrace (sehr praktisch) verwenden oder 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

Nachdem Sie die kostspieligen Abfragen identifiziert haben, können Sie die tatsächlichen Ausführungspläne generieren und prüfen.

64
Mitch Wheat

Das folgende Skript gibt Ihnen das Ergebnis.

SELECT TOP 10 
SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, 
qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC 
21
gngolakia

Ich hatte noch nie zuvor von diesem Tool gehört, aber Microsoft stellt eine Reihe von Berichten bereit, mit denen Sie genau das erreichen können - einschließlich langsamster Abfragen. Überprüfen Sie die Performance Dashboard-Berichte .

Ich bin nicht sicher, ob sie mit SQL 2008 kompatibel sind, aber es lohnt sich.

4
Tom Lianza

In SQL Server 2008 gibt es ein neues Tool, Performance Studio , das auf Dynamic Management Views aufbaut, die automatisch vom Server verwaltet werden, und einen Überblick über die Serverleistung bietet. Es lohnt sich auszuprobieren.

2
jaraics

Würde der SQL Server Profiler das tun, was Sie brauchen? Ich habe 2008 noch nicht verwendet, daher weiß ich nicht, ob das Tool immer noch vorhanden ist. Wenn dies der Fall ist, können Sie eine Ablaufverfolgung einrichten, um Abfragen zu protokollieren, die bestimmte Kriterien erfüllen (z. B. solche, die die CPU ausführen und die CPU oben betreiben eine bestimmte Schwelle).

Wir haben dies für unser Projekt verwendet und es hat uns sehr geholfen, schlecht funktionierende Abfragen zu beheben (obwohl es nicht die ganze Zeit läuft, verlassen Sie sich auf die allgemeinen Windows-Leistungsindikatoren, um die Leistungsüberwachung zu überwachen).

2
cfeduke

(Dell) Quest SQL Optimizer für SQL Server 9.0 führt das SQL-Suchmodul ein, mit dem Benutzer die SQL-Ressourcen mit dem meisten Ressourcen in Ihrem SQL Server finden können https://support.quest.com/softwaredownloads.aspx?pr = 268445262

0
user2485339