Welche Schritte sollten notwendig sein, eine schlecht funktionierende Abfrage zu optimieren?

StackOverflow https://stackoverflow.com/questions/61008

  •  09-06-2019
  •  | 
  •  

Frage

Ich weiß, dass dies eine große Frage ist, aber ich habe einige schlechte Performer geerbt und müssen sie schlecht optimieren. Ich frage mich, was die häufigsten Schritte sind beteiligt zu optimieren. Also, welche Schritte zu tun einige von euch nehmen, wenn sie mit der gleichen Situation konfrontiert?

  

Verwandte Frage:
   Welche generische Techniken angewendet werden können, um SQL-Abfragen zu optimieren?

War es hilfreich?

Lösung

  1. Schauen Sie sich den Ausführungsplan in Query Analyzer
  2. Sehen Sie, was Schritt kostet die meisten
  3. Optimieren Sie den Schritt!
  4. Zurück zu Schritt 1 [thx to Vinko ]

Andere Tipps

In SQL Server können Sie in dem Query Plan in Query Analyzer oder Management Studio suchen. Dies wird Ihnen die grobe Prozentsatz der Zeit, in jeder Charge von Anweisungen ausgegeben erzählen. Sie werden für die folgenden aussehen soll:

  • Table Scans; dies bedeutet, dass Sie völlig fehlender Indizes
  • Index-Scans; Ihre Abfrage der richtigen Indizes
  • mit nicht sein kann
  • Die Dicke der Pfeile zwischen jedem Schritt in einer Abfrage zeigen Ihnen, wie viele Zeilen von diesem Schritt erzeugt werden, sehr dicke Pfeile bedeuten, dass Sie eine Menge von Zeilen verarbeiten und anzeigen können, dass einige Joins optimiert werden müssen.

Einige andere allgemeine Tipps:

  • Eine große Menge von bedingten Anweisungen, wie mehrere if-else-Anweisungen können SQL Server verursachen, ständig den Abfrageplan neu erstellen. Sie können für diese Verwendung Profiler überprüfen.
  • Stellen Sie sicher, dass verschiedene Abfragen nicht miteinander, wie eine Update-Anweisung blockiert eine select-Anweisung zu blockieren. Dies kann durch die Angabe des (nolock) Hinweises in SQL Server select-Anweisungen vermieden werden.
  • Wie andere erwähnt haben, versuchen Sie die Performance-Tuning-Assistenten in Management Studio aus.

Schließlich würde ich empfehle eine Reihe von Belastungstests zu schaffen (Visual Studio 2008 Test-Ausgabe verwendet wird), mit denen Sie Ihre Anwendung des Verhalten zu simulieren, wenn Umgang mit einer großen Anzahl von Anfragen verwendet werden können. Einige SQL-Performance-Engpässe sich nur manifestieren unter diesen Umständen und in der Lage zu sein, sie zu reproduzieren macht es viel leichter zu beheben.

Indizes kann ein guter Anfang sein ...

Die niedrig hängenden Früchte mit den SQL Server Index Tuning-Assistent umgeworfen werden können.

Ich bin über andere Datenbanken nicht sicher, aber für SQL Server ich den Ausführungsplan zu empfehlen. Es ist sehr klar (wenn auch mit vielen vertikalen und horizontalen Scrollen, es sei denn, Sie haben ein 400" Monitor!) Zeigt, welche Schritte der Abfrage werden die Zeit aufsaugt.

Wenn Sie haben einen Schritt, der ein verrücktes 80% nimmt, dann vielleicht ein Index hinzugefügt werden könnte, dann, nachdem den Index zwicken, den Ausführungsplan erneut ausführen, um Ihren nächsten größten Schritt zu finden.

Nach ein paar Tweaks können Sie feststellen, dass es wirklich keine Schritte sind, die von den anderen abheben das heißt, sie sind alle 1-2% pro Person. Wenn das der Fall ist, dann könnten Sie dann müssen sehen, ob es eine Möglichkeit ist, dass Sie die Datenmenge reduzieren können in der Abfrage enthalten, sind diese vier Millionen geschlossenen Kundenaufträge in den „Aktive Kundenaufträge“ Abfrage einbezogen werden müssen ? Nein, so ausschließen alle, die mit STATUS = 'C' ... oder so ähnlich.

Eine weitere Verbesserung, die Sie aus dem Ausführungsplan sehen werden sind Lesezeichen-Lookups, im Grunde findet eine Übereinstimmung in dem Index, aber dann haben SQL Server schnell durch die Tabelle schleppen den Datensatz, den Sie wollen zu finden. Dieser Vorgang kann manchmal länger dauern als nur Scannen der Tabelle an erster Stelle haben würde, wenn das der Fall ist, brauchen Sie wirklich diesen Index?

Mit Indizes und insbesondere mit SQL Server 2005 sollten Sie die Klausel enthalten aussehen, dies im Grunde können Sie eine Spalte in einem Index haben, ohne wirklich in den Index zu sein, so dass, wenn alle Daten, die Sie für Ihre Anfrage benötigen, ist in Ihr Index oder ein eingeschlossener columnn dann SQL Server noch nicht einmal an den Tisch zu sehen, eine große Leistung Pick-up.

Es gibt ein paar Dinge, die Sie bei Ihrer Anfrage die Leistung zu optimieren aussehen kann.

  1. Stellen Sie sicher, dass Sie nur das Minimum an Daten. Stellen Sie sicher, dass Sie nur die Spalten auswählen, die Sie benötigen. Reduzieren Feldgrößen auf ein Minimum.

  2. Betrachten de-Normalisierung Ihre Datenbank zu reduzieren verbindet

  3. Vermeiden Schleifen (d.h. fetch Cursors), haften bleiben Operationen einzustellen.

  4. Implementieren Sie die Abfrage als eine gespeicherte Prozedur, da dies vorkompilierte und wird schneller ausgeführt.

  5. Stellen Sie sicher, dass Sie die richtigen Indizes eingerichtet haben. Wenn Ihre Datenbank meist verwendet für die Suche dann mehr Indizes berücksichtigen.

  6. Mit dem Ausführungsplan, um zu sehen, wie die Verarbeitung erfolgt. Was Sie vermeiden möchten, ist ein Tabellen-Scan, da dies teuer ist.

  7. Stellen Sie sicher, dass die Auto-Statistik festgelegt ist auf. SQL muss dies die optimale Ausführung der Entscheidung helfen. Siehe Mike Gunderloy des großen Beitrag für weitere Informationen. Grundlagen der Statistik in SQL Server 2005

  8. Stellen Sie sicher, Ihre Indizes sind nicht fragmentiert Reduzierung der SQL Server-Index Fragmentation

  9. Stellen Sie sicher, dass Ihre Tabellen nicht fragmentiert. Wie Detect Tabelle Fragmentation in SQL Server 2000 und 2005

Der Ausführungsplan ist ein guter Start und werden Ihnen helfen, herauszufinden, was Teil der Anfrage müssen Sie bekämpfen.

Wenn Sie die wo herauszufinden, ist es Zeit, die, wie zu bewältigen und warum. Werfen Sie einen Blick auf die Art von Fragen, die Sie vorzuformen versuchen. Vermeiden Sie Schleifen an allen Kosten, da sie langsam sind. Vermeiden Sie Cursor auf allen Kosten, weil sie langsam sind. Halten Sie sich an basierte Abfragen festgelegt, wenn immer es möglich ist.

Es gibt Möglichkeiten, SQL Hinweise auf die Art zu geben, zu verwenden, schließt sich, wenn Sie schließt sich verwenden. Seien Sie vorsichtig, hier aber, während ein Hinweis, wenn Ihre Abfrage beschleunigen kann, kann es verlangsamen Ihre Abfrage 10 falten Sie das nächste Mal durch, abhängig von den Daten und Parametern.

Schließlich, stellen Sie sicher, dass Ihre Datenbank gut indiziert ist. Ein guter Anfang ist jedes Feld, das in einer enthalten ist, wo Klausel wahrscheinlich einen Index auf es haben sollte.

Schauen Sie sich die Indizes für die Tabellen, die die Abfrage machen. Ein Indizes können auf bestimmte Felder benötigt werden, die in der where-Klausel teilnehmen. Schauen Sie auch bei den verwendeten Feldern in den Verknüpfungen in der Abfrage (falls vorhanden Joins). Wenn Indizes bereits vorhanden sind, sehen Sie die Art des Index.

, dass Failing (weil es Negative Sperrhinweise verwendet) Schauen Sie sich Hinweise Sperren und Benennung ausdrücklich den Index in der Verknüpfung zu verwenden. Mit NOLOCKS ist offensichtlich, wenn Sie eine Menge von Deadlock-Transaktionen zu bekommen.

Tu, was römische und Andy S erwähnte erste though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top