Dezember 19, 2021

Debuggen der SQL Server-Leistung

 Debuggen der SQL Server-Leistung

SQL-Inschrift vor Laptop- und Codehintergrund. Lernen Sie SQL-Programmiersprache, Computerkurse, Schulungen.

Vor kurzem haben wir an der Fehlerbehebung von SQL Server-Leistungsproblemen für einige unserer großen Kunden gearbeitet, die SQL Server als Datenbank ausführen. In diesem Artikel werde ich zusammenfassen, was ich aus dem Prozess gelernt habe, indem ich einige Schritte beschreibe, die wir unternehmen können, um Leistungsprobleme zu beheben.

Überprüfen der SQL Server-Konfiguration

Stellen Sie sicher, dass der Datenbankserver mit genügend Ressourcen konfiguriert ist, z. B. Anzahl der CPU-Kerne und Arbeitsspeicher.

Um die Serverkonfiguration zu überprüfen, können Sie die Ansicht „Systeminformationen“ öffnen:

 Debuggen der SQL Server-Leistung

Zum Überprüfen der SQL Server-Speichereinstellung,

  1. Starten Sie SQL Server Management Studio.
  2. Klicken Sie mit der rechten Maustaste auf Ihre Datenbankinstanz und wählen Sie „Eigenschaften“.
  3. Klicken Sie im Popup-Fenster „Servereigenschaften“ auf die Tabelle „Speicher“.
  4. Überprüfen Sie die Speichereinstellungen.

 Debuggen der SQL Server-Leistung

Stellen Sie sicher, dass der Snapshot-Modus aktiviert ist

Stellen Sie sicher, dass der Snapshot-Modus für die Datenbank aktiviert ist. Um zu verhindern, dass SQL Server gesperrt wird, sollte das Snapshot-Modus-Flag aktiviert sein. Führen Sie die folgende Abfrage aus, um zu überprüfen, ob das Flag aktiviert ist:

SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name= '<database_name>'

Wenn die Abfrage ‚1‘ zurückgibt, ist der Snapshot-Modus bereits aktiviert. Führen Sie andernfalls die folgende Abfrage aus, um sie zu aktivieren.

ALTER DATABASE <database_name> SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;

VERWANDT: Definieren und Implementieren von Anforderungen Baselines

Datenbankindizes überprüfen

Überprüfen Sie die Datenbankindizes, um sicherzustellen, dass keine Indizes fehlen. Führen Sie die folgende Abfrage aus, um alle Indizes in der Datenbank aufzulisten (Quelle: tsql – Liste aller Indexspalten & in SQL Server DB – Stack Overflow):

SELECT t.name TableName, col.name ColumnName, ind.name IndexNameFROM sys.indexes indINNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_idINNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_idINNER JOIN sys.tables t ON ind.object_id = t.object_idWHERE (ind.is_primary_key = 0 AND t.is_ms_shipped = 0)ORDER BY t.name, col.name, ind.name

Speichern Sie die Abfrageergebnisse in einer Textdatei mit tabulatorgetrennten Spalten, damit sie später in ein Tabellenkalkulationsprogramm importiert werden können.

Fragmentierung vermeiden

Stellen Sie sicher, dass die Datenbankindizes nicht fragmentiert sind. Die Indizes in der Datenbank helfen, Datenbankabfragen zu beschleunigen. Wenn sie jedoch fragmentiert werden, können die Abfragen sehr langsam ausgeführt werden. Im Rahmen der Datenbankpflege sollten die Indizes regelmäßig neu organisiert oder neu aufgebaut werden.

Führen Sie die folgende Abfrage aus, um den Fragmentierungsprozentsatz für alle Indizes in der Datenbank zu überprüfen (Quelle: So überprüfen Sie die Indexfragmentierung für Indizes in einer Datenbank):

SELECT dbschemas.Jama Software AS 'Schema', dbtables.Jama Software AS 'Table', dbindexes.Jama Software AS 'Index', indexstats.avg_fragmentation_in_percent, indexstats.page_count, dbindexes.fill_factorFROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstatsINNER JOIN sys.tables dbtables ON dbtables. = indexstats.INNER JOIN sys.schemas dbschemas ON dbtables. = dbschemas.INNER JOIN sys.indexes AS dbindexes ON dbindexes. = indexstats. AND indexstats.index_id = dbindexes.index_idWHERE indexstats.database_id = DB_ID()ORDER BY indexstats.avg_fragmentation_in_percent DESC

Hier ist ein Beispielabfrageergebnis für eine Datenbank mit stark fragmentierten Indizes:

Debugging SQL Server-Leistung

Für Indizes mit Seitenzahlen größer als 1000 sollte „avg_framentation_in_percent“ unter 10% gehalten werden. Für kleine Indizes spielt es keine große Rolle. Als Faustregel gilt, dass Indizes mit Fragmentierungsprozentsätzen zwischen 5% und 30% neu organisiert werden können und Indizes mit Fragmentierungsprozentsätzen größer als 30% neu erstellt werden sollten.

Um einen einzelnen Index neu zu organisieren:

ALTER INDEX REORGANIZE

So erstellen Sie einen einzelnen Index neu:

ALTER INDEX REBUILD WITH (ONLINE = ON)

Sie können einen Index auch mit SQL Server Management Studio reorganisieren oder neu erstellen, indem Sie mit der rechten Maustaste auf den Index klicken, den Sie neu erstellen oder reorganisieren möchten.

Wenn die Datenbank viele defragmentierte Indizes enthält, können Sie die folgende Abfrage ausführen, um alle neu zu erstellen (Quelle: SQL SERVER – 2008 -2005 – Erstellen Sie jeden Index aller Datenbanktabellen neu – Erstellen Sie den Index mit FillFactor neu). Bitte beachten Sie, dass die Abfrage für eine große Datenbank eine Weile dauern kann. Es wird empfohlen, die Abfrage auszuführen, während die Datenbank inaktiv oder offline ist.

DECLARE @TableName VARCHAR(255)DECLARE @sql NVARCHAR(500)DECLARE TableCursor CURSOR FORSELECT OBJECT_SCHEMA_NAME()+'.'+name AS TableNameFROM sys.tablesOPEN TableCursorFETCH NEXT FROM TableCursor INTO @TableNameWHILE @@FETCH_STATUS = 0BEGINSET @sql = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD'PRINT @sqlEXEC (@sql)FETCH NEXT FROM TableCursor INTO @TableNameENDCLOSE TableCursorDEALLOCATE TableCursorGO

Erwägen Sie, einen Wartungsjob in SQL Server Studio einzurichten, um die Neuorganisation des Datenbankindex regelmäßig auszuführen. Obwohl das Neu Erstellen von Indizes in SQL Server wahrscheinlich offline oder im Leerlauf des Systems erfolgen sollte, kann die Indexreorganisation online erfolgen. Hier ist ein guter Artikel zu diesem Thema: Rebuild or Reorganize: SQL Server Index Maintenance.

Um einen Indexreorganisationsplan in SQL Server einzurichten, klicken Sie mit der rechten Maustaste auf „Verwaltung“, dann auf „Wartungspläne“ und wählen Sie „Neuer Wartungsplan“ oder „Wartungsplanassistent“. Befolgen Sie die Anweisungen, um einen Plan zu erstellen.

Debuggen der SQL Server-Leistung

 Debuggen der SQL Server-Leistung

RELATED: Release Management Options in Jama Connect

Run Missing Index Report

SQL Server bietet ein Tool, das Datenbankaktivitäten analysiert und zusätzliche Indizes empfiehlt, die bei der Abfrageleistung hilfreich sein können. Der Bericht könnte uns einige Ideen geben, warum bestimmte Abfragen langsam sind.

Um den Bericht zu generieren, führen Sie die folgende Abfrage aus, nachdem die Datenbankinstanz eine Weile verwendet wurde (Gutschrift: Erstellen Sie nicht einfach blind diese „fehlenden“ Indizes!):

SELECT d., s = OBJECT_SCHEMA_NAME(d.), o = OBJECT_NAME(d.), d.equality_columns, d.inequality_columns, d.included_columns, s.unique_compiles, s.user_seeks, s.last_user_seek, s.user_scans, s.last_user_scan, s.avg_total_user_cost, s.avg_user_impactFROM sys.dm_db_missing_index_details AS dINNER JOIN sys.dm_db_missing_index_groups AS gON d.index_handle = g.index_handleINNER JOIN sys.dm_db_missing_index_group_stats AS sON g.index_group_handle = s.group_handleWHERE d.database_id = DB_ID() AND OBJECTPROPERTY(d., 'IsMsShipped') = 0

Lesen Sie den Artikel Fehlende Indizes finden, um die Ausgabe dieser Abfrage zu verstehen.

Datenbanksitzungen überwachen

Verwenden Sie Activity Monitor, um Datenbanksitzungen zu überwachen. Microsoft SQL Server Management Studio wird mit Activity Monitor geliefert, mit dem die Datenbanksitzungen überwacht werden können.

Debuggen der SQL Server-Leistung

Suchen Sie nach Sitzungen, die für längere Zeit von anderen Sitzungen blockiert werden. Klicken Sie mit der rechten Maustaste auf die Sitzung und wählen Sie „Details“, um die Details der Abfrage anzuzeigen, die dem Prozess zugeordnet ist.

Debuggen der SQL Server-Leistung

Verwenden des Windows-Ressourcenmonitors

Mit dem Windows-Ressourcenmonitor können Sie die Speicher- und CPU-Auslastung des SQL Server-Prozesses überwachen, um sicherzustellen, dass genügend Speicher im System vorhanden ist und die CPU nicht gesättigt ist. Bitte beachten Sie, dass es ein bekanntes Problem für SQL Server 2008 gibt, bei dem die für den SQL Server-Prozess im Ressourcenmonitor angezeigte Speicherzahl nicht korrekt ist.

Debuggen der SQL Server-Leistung

 Debuggen der SQL Server-Leistung

Identifizieren langsamer Abfragen

Wenn wir festgestellt haben, dass die Leistung nicht ressourcenbezogen ist, besteht der nächste Schritt darin, langsame Abfragen zu identifizieren, die zu einer schlechten Leistung führen.

Die folgende Abfrage gibt die 100 langsamsten Abfragen zurück, die länger als 300 ms ausgeführt werden (Quelle: Lange laufende Abfragen):

SELECT st.text, qp.query_plan, qs.*FROM ( SELECT TOP 50 * FROM sys.dm_exec_query_stats ORDER BY total_worker_time DESC) AS qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS stCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qpWHERE qs.max_worker_time > 300 OR qs.max_elapsed_time > 300

Hier ist ein Screenshot einiger Beispielergebnisse:

Debuggen der SQL Server-Leistung

Sobald wir eine Liste langsamer Abfragen zusammengestellt haben, können wir sie direkt in der Datenbank ausführen und uns die Ausführungspläne ansehen, um diese Abfragen zu verstehen.

Andere Tools

Hier finden Sie eine Liste anderer Tools, die zur Fehlerbehebung bei SQL Server- und Java-Anwendungen verwendet werden können:

  • SQL Server Profiler: kann verwendet werden, um langsame Abfragen zu identifizieren. Sie können es von SQL Server Management Studio
  • VisualVM starten: kann verwendet werden, um die Java-Ressourcennutzung zu überwachen und Thread-Dumps zu erstellen
  • Java Mission Control / Flight Recording: Systemereignisse überwachen und aufzeichnen
  • JProfiler: Identifizieren Sie langsame Dienst- oder Datenbankaufrufe (Entwicklung, nicht unterstützt von 8.x-Bereitstellung)
  • New Relic: Kann die Datenbankleistung überwachen und langsame Abfragen aufzeichnen

Checklisten

Hier finden Sie eine Liste von Informationen, die zur Behebung von SQL Server-Problemen gesammelt werden können:

  1. Datenbankserverkonfiguration (Anzahl der CPU-Kerne, physischer Speicher, Speicherplatz, Windows Server-Version, SQL Server-Version, SQL Server-Speichereinstellungen)
  2. Anwendungsserverkonfiguration (Anzahl der CPU-Kerne, physischer Speicher, Speicherplatz, Java Core-Speichereinstellungen)
  3. Datenbankindexstatistik
  4. Datenbankfragmentierungsstatistik
  5. SQL Server fehlender Indexbericht
  6. Speicher- und CPU-Statistiken des Datenbankservers, wenn der Server langsam ist
  7. Vorgänge, die dazu führen, dass das System langsam ist
  8. SQL Server slow query report
  9. Statistik der Datenbanktabelle
  10. Einige Thread-Dumps aus Java-Anwendungen, die gegebenenfalls während der langsamen Vorgänge erstellt wurden

Fazit

Das Debuggen von SQL Server-Leistungsproblemen ist nicht immer einfach. Aber mit den richtigen Werkzeugen und Geduld sollten wir in der Lage sein, die Ursache dieser Probleme zu verstehen. Ich hoffe, die Informationen in diesem Artikel helfen dabei.

  • Autor
  • Neueste Beiträge
Neueste Beiträge von Sean Tong (alle anzeigen)
  • Debuggen der SQL Server-Leistung – 12. Oktober 2016
  • Überwachen von Java-Anwendungen, die in Docker-Containern ausgeführt werden – Juni 1, 2016

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.