Warum wird meine Abfrage in Umgebung A schnell ausgeführt, in Umgebung B jedoch langsam?

7

Ich habe ein Stück SQL, das in Umgebung A sehr schnell zu laufen scheint, aber genau dieselbe Abfrage läuft in Umgebung B sehr langsam!

Die Umgebungen sollten gleich sein. Was soll ich also tun und / oder wo soll ich suchen, um festzustellen, warum die Abfrage nicht dieselbe Leistung erbringt?

LowlyDBA
quelle

Antworten:

13

Es gibt viele interne und externe Faktoren für SQL Server, die dazu führen können, dass dieselbe Abfrage in verschiedenen Umgebungen unterschiedlich ausgeführt wird, selbst wenn sie nahezu identisch konfiguriert sind. Jeder dieser Faktoren kann zu sehr unterschiedlichen Abfrageplänen und -leistungen führen.

Server

  • Ist die Hardware in allen Umgebungen gleich (Festplatten, Speicher, CPU usw.)?
    • Könnten lautstarke Nachbarn bei Verwendung von VMs die Gesamtleistung der VM beeinträchtigen?
    • Haben Autoscaling und andere Konfigurationen in der Cloud Parität?
  • Sind Umgebungen zwischen physisch / virtuell / Cloud gemischt?
  • Stimmen die Betriebssystemversionen überein?
  • Befinden sich Umgebungen in verschiedenen Rechenzentren?

Beispiel

  • Sind die SQL Server-Versionen gleich?
    • Eine CU oder SP kann einen großen Unterschied machen, selbst wenn die Hauptversionen gleich sind.
  • Ist die aktive Arbeitslast während der Abfrageausführung (en) vergleichbar?
    • Ist in allen Umgebungen das gleiche Abfragevolumen vorhanden?
    • Ist die Art der Arbeitslast in allen Umgebungen gleich?
  • Nehmen alle Umgebungen am gleichen HA / DR-Setup teil?
    • In niedrigeren Umgebungen sind häufig keine Verfügbarkeitsgruppen, kein Protokollversand oder keine Replikation eingerichtet, während Production / DR diese Technologien möglicherweise verwendet.
  • Werden dieselben Wartungsjobs in allen Umgebungen nach denselben Zeitplänen ausgeführt?
  • Sind Trace-Flags in allen Umgebungen gleichwertig?
  • Werden in allen Umgebungen dieselben Sicherungsjobs ausgeführt?
    • Die Auswirkungen von Sicherungen sollten minimal sein, werden jedoch häufig in niedrigeren Umgebungen überhaupt nicht ausgeführt.
  • Sind die Systemkonfigurationen gleich?

Datenbank

  • Sind die Schemas / Indizes / Statistiken / Objekte in allen Umgebungen gleich?
  • Gibt es in allen Umgebungen genau dieselben Daten?
    • Datenmenge
    • Verteilung von Daten
    • Datengröße (denken Sie an Dummy-Daten in Datentypen variabler Länge, die möglicherweise nicht die Größe der tatsächlichen Werte in anderen Umgebungen widerspiegeln)
  • Sind die Konfigurationen auf Datenbankebene gleich?
  • Sind die Kompatibilitätsstufen gleich?

Vor diesem Hintergrund ist es nicht verwunderlich, dass es in vielen Fällen einfach nicht möglich ist , jeden Aspekt einer Datenbank in verschiedenen Umgebungen perfekt zu kopieren. Während Tests ein gutes Maß an Sicherheit darüber geben können, wie Abfragen in jeder Umgebung ausgeführt werden, sollte es keine Überraschung sein, wenn zwischen den Umgebungen Diskrepanzen bestehen. Bei der Entwicklung einer neuen Abfrage ist häufig eine zusätzliche Optimierung erforderlich, wenn die Produktion in Richtung Produktion verschoben wird.

Normalerweise sollte das Optimieren einer Abfrage, die in einer Umgebung langsamer ist, keine Regressionen in den generierten Ausführungsplänen verursachen. Daher besteht die Möglichkeit, Indizes, Statistiken oder die Abfrage selbst anzupassen, um eine allgemeine Verbesserung zu erzielen.

Schlussbemerkung: Niedrigere Umgebungen sind zu klein und es ist häufig nicht zu erwarten, dass sie die gleiche Leistung wie eine Produktions- oder Vorproduktionsumgebung erbringen.

Mehr Ressourcen:

LowlyDBA
quelle
9

Die anderen Antworten sind gut, aber ich möchte hinzufügen, dass Sie die Datenmenge in Umgebung B und etwaige Konflikte mit anderen Abfragen berücksichtigen sollten.

Einige SQL-Abfragen zeigen isoliert keine Leistungsprobleme (z. B. 1000 Zeilen in der Tabelle, keine anderen ausgeführten Abfragen), können jedoch mit 10.000.000 Zeilen in der Tabelle (z. B. Probleme mit dem Parameter-Sniffing) und / oder anderen Abfragen, in die möglicherweise geschrieben wird, Horror-Shows sein oder Sperren der beteiligten Tabellen.

Ich stimme den anderen Antworten zum Überprüfen der Übereinstimmung von Hardware / Umgebungen / Konfigurationen zuerst zu. Wenn jedoch nichts Offensichtliches auftaucht, sollten Sie sich die Pläne zur Ausführung von Abfragen ansehen, SQL Profiler ausführen usw.

Phil S.
quelle
3

Kurz gesagt, Sie müssen isolieren, ob die Datenbank selbst im Vergleich zur anderen langsam ist oder ob ihre Umgebung langsamer ist. Schließen Sie zuerst die einfachsten Dinge aus.

Das ist mir schon ein paar Mal passiert. Jedes Mal stellte sich heraus, dass es sich um eine Umgebung handelte: Jemand anderes hämmerte weg und hungerte die Datenbank von IOPS auf einem Server.

Führen Sie ein Top (1) auf dem langsameren Server aus und prüfen Sie, ob in der CPU viele Wartezustände auftreten oder ob die CPU in einer virtuellen Umgebung gestohlen wird.

Dies hilft auch dabei, auf fehlende Indizes hinzuweisen, die dazu führen, dass Ausführungspläne vollständige Tabellenscans anstelle von Indexscans durchführen (dies ist jedoch bei langsamer Abfrageprotokollierung leicht zu erkennen). Dies wird auch in ps als procs in einem D-Zustand angezeigt.

Sobald Sie dies ausgeschlossen haben, ist es Zeit, sich eingehender mit der Hardware zu befassen: Wird die Arbeit auf alle CPUs verteilt, hat sich ein Netzwerkport auf 100 MB neu ausgehandelt. Führen Sie vmstat und / oder iostat auf beiden Computern aus und vergleichen Sie die Unterschiede.

Wenn die Datensätze identisch sind, generiert dieselbe Abfrage für beide denselben Ausführungsplan? Enthalten Tabellen die gleiche Anzahl von Zeilen? Sind die Indexdefinitionen identisch? Haben die Tabellen ähnliche Fragmentierungsgrade? Ähnliche Anzahl aktiver Verbindungen?

dland
quelle