Database
 sql >> Datenbank >  >> RDS >> Database

Veraltete Funktionen, die Sie aus Ihrer Toolbox herausnehmen sollten – Teil 1

Microsoft hat heutzutage nicht die Angewohnheit, Dinge abzulehnen, aber wenn sie es tun, dann aus einem bestimmten Grund – und sicherlich nicht, weil sie Ihnen das Leben schwerer machen wollen. Im Gegenteil, es liegt fast immer daran, dass sie bessere und modernere Methoden entwickelt haben, um dieselben Probleme zu lösen.

Aber Gewohnheiten sind schwer zu brechen; frag mich woher ich das weiß. Allzu oft sehe ich Menschen, die an einer älteren Methode festhalten, um eine Aufgabe zu erledigen, obwohl es eine bessere Methode gibt.

Ich möchte einige aktuelle Beispiele vorstellen, die veranschaulichen, wie uns die Verwendung veralteter SQL Server-Funktionen weiterhin belastet. In diesem ersten Teil möchte ich über … sprechen

Systemprozesse

Die Systemtabelle sys.sysprocesses wurde vor langer Zeit in SQL Server 2005 durch eine Reihe dynamischer Verwaltungsansichten (DMVs) ersetzt, insbesondere durch sys.dm_exec_requests , sys.dm_exec_sessions und sys.dm_exec_connections . Die offizielle Dokumentation für sys.sysprocesses warnt:

Diese SQL Server 2000-Systemtabelle ist aus Gründen der Abwärtskompatibilität als Ansicht enthalten. Wir empfehlen, stattdessen die aktuellen SQL Server-Systemansichten zu verwenden. Die entsprechende(n) Systemansicht(en) finden Sie unter Zuordnen von Systemtabellen zu Systemansichten (Transact-SQL). Dieses Feature wird in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie die Verwendung dieser Funktion bei neuen Entwicklungsarbeiten und planen Sie, Anwendungen zu ändern, die diese Funktion derzeit verwenden.

Ein aktuelles Beispiel

Kürzlich untersuchte eines unserer Teams ein Problem mit der Latenz des Protokolllesers. Wir achten hier sehr auf die Latenz, zusammen mit allen lang andauernden Transaktionen, da sie nachgelagerte Auswirkungen auf Technologien haben, die den Protokollleser verwenden – wie Verfügbarkeitsgruppen und Transaktionsreplikation. Unsere ersten Warnungen werden normalerweise auf einem Dashboard entdeckt, das die Latenz des Protokolllesers gegen die Transaktionsdauer darstellt (ich erkläre die Zeitpunkte, die ich mit t0 und t1 in Kürze):

Sie bestimmten, sagen wir zum Zeitpunkt t0 , dass eine bestimmte Sitzung eine offene Transaktion hatte, die den Protokollleseprozess blockierte. Sie überprüften zuerst die Ausgabe von DBCC INPUTBUFFER , um festzustellen, was diese Sitzung zuletzt getan hat, aber die Ergebnisse zeigten einfach, dass sie während ihrer Transaktion auch andere Stapel ausgegeben haben:

event_type       parameters   event_info
--------------   ----------   ---------------
Language Event   0            SET ROWCOUNT 0;

Beachten Sie, dass DBCC INPUTBUFFER hat in modernen Versionen auch einen leistungsfähigeren Ersatz:sys.dm_exec_input_buffer . Und obwohl es keine explizite Verfallswarnung gibt, ist die offizielle Dokumentation für DBCC Befehl hat diesen sanften Schubs:

Verwenden Sie ab SQL Server 2014 (12.x) SP2 sys.dm_exec_input_buffer, um Informationen zu Anweisungen zurückzugeben, die an eine Instanz von SQL Server gesendet wurden.

Nachdem sie nichts aus dem Eingabepuffer erhalten hatten, haben sie sys.sysprocesses abgefragt :

SELECT 
  spid, 
  [status], 
  open_tran, 
  waittime, 
  [cpu], 
  physical_io, 
  memusage, 
  last_batch
FROM sys.sysprocesses 
WHERE spid = 107;

Die Ergebnisse waren ähnlich nutzlos, zumindest in Bezug auf die Feststellung, was die Sitzung getan hatte, um ihre Transaktion offen zu halten und den Protokollleser zu stören:

Ich hebe das physical_io hervor Kolumne, weil dieser Wert eine Diskussion darüber auslöste, ob sie das Risiko eingehen wollten, die Schlafsitzung zu beenden. Die Überlegung war, dass für den Fall, dass all diese physischen I/Os Schreibvorgänge sind, das Beenden der Transaktion zu einem langwierigen und störenden Rollback führen könnte – was das Problem möglicherweise noch verschlimmert. Ich werde hier keine tatsächlichen Zeiten angeben, aber sagen wir einfach, dies wurde zu einem längeren Gespräch, und es ließ das System ab dem Zeitpunkt t0 zum Zeitpunkt t1 in der Grafik oben.

Warum dies ein Problem ist

Das Problem in diesem speziellen Fall ist, dass sie diese Zeit damit verbracht haben, eine Entscheidung auf der Grundlage unvollständiger Informationen zu erwägen. Handelt es sich bei diesen I/Os um Lese- oder Schreibvorgänge? Wenn der Benutzer eine offene Transaktion hat und nur viele Daten gelesen hat, hat das Zurücksetzen dieser Transaktion weitaus weniger Auswirkungen, als wenn er sich geändert hat viele Daten. Also statt sys.sysprocesses , mal sehen, was die modernere DMV, sys.dm_exec_sessions , kann uns etwas über diese Sitzung zeigen:

SELECT 
  session_id, 
  [status], 
  open_transaction_count, 
  cpu_time, 
  [reads], 
  writes, 
  logical_reads, 
  last_request_start_time,
  last_request_end_time
FROM sys.dm_exec_sessions 
WHERE session_id = 107;

Ergebnisse:

Hier sehen wir, dass sys.dm_exec_sessions teilt die physischen E/A separat in Lese- und Schreibvorgänge auf. Dadurch können wir viel schneller eine viel fundiertere Entscheidung treffen als t1 - t0 , über die Auswirkungen eines möglichen Rollbacks. Wenn die E/A ausschließlich aus Schreibvorgängen besteht, und je nachdem, wie hoch die Zahl ist, zögern wir möglicherweise etwas länger und verbringen vielleicht die Zeit damit, den Benutzer ausfindig zu machen (damit wir ihm auf die Finger schlagen oder ihn fragen können, warum er eine offene Transaktion hat ). Wenn wir wissen, dass es sich hauptsächlich um Lesevorgänge handelt, können wir stattdessen dazu tendieren, die Sitzung zu beenden und ein Rollback der Transaktion zu erzwingen.

Sicher, sys.sysprocesses hat dbid und waittime . Aber dbid ist sowieso unzuverlässig und kaum nützlich, insbesondere für datenbankübergreifende Abfragen; es gibt viel bessere Informationen in sys.dm_tran_locks . Warteinformationen (Zeit und letzter Wartetyp) finden Sie in sys.dm_exec_requests , aber viel detailliertere Informationen werden in sys.dm_exec_session_wait_stats angeboten (in SQL Server 2016 hinzugefügt). Eine Ausrede, die ich oft hörte, war sys.dm_exec_sessions open_tran fehlte , aber open_transaction_count wurde in SQL Server 2012 wieder hinzugefügt. Es gibt also kaum einen Grund, überhaupt über die Verwendung von sys.sysprocesses nachzudenken heute.

Wenn Sie herausfinden möchten, wie oft sys.sysprocesses seit dem letzten Neustart von SQL Server verwiesen wurde, können Sie diese Abfrage für die Leistungsindikatoren DMV:

ausführen
SELECT instance_name, cntr_value
  FROM sys.dm_os_performance_counters
  WHERE [object_name] LIKE N'%:Deprecated Features%'
    AND instance_name = N'sysprocesses' 
  ORDER BY cntr_value DESC;

Wenn Sie heute Nacht wirklich nicht schlafen möchten oder einfach ständig Dinge auf die Wäscheliste setzen möchten, um die Sie sich Sorgen machen, entfernen Sie das Prädikat für instance_name . Dadurch erhalten Sie eine beängstigende allgemeine Vorstellung davon, wie viele Dinge auf Ihren Instanzen ausgeführt werden, die Sie eventuell ändern müssen.

Laden Sie in der Zwischenzeit sp_WhoIsActive herunter , die äußerst nützliche gespeicherte Prozedur von Adam Machanic zur Überwachung und Fehlerbehebung von SQL Server-Prozessen in Echtzeit. Wir haben diese gespeicherte Prozedur für jede Instanz in unserer Umgebung bereitgestellt, und Sie sollten dies auch tun, unabhängig davon, welche anderen High-End-Überwachungstools Sie möglicherweise ebenfalls verwenden.

Nächstes Mal

In Teil 2 werde ich ein wenig über SQL Server Profiler sprechen, eine Anwendung, die Menschen eher aus Vertrautheit als aus irgendetwas anderem verwenden – ohne zu wissen, wie gefährlich sie sein kann.