Lernen, SQL-Abfragen zu optimieren und Ausführungspläne zu verstehen - Ressourcen?


8

Ich schreibe immer mehr SQL-Abfragen bei der Arbeit (hauptsächlich Oracle 11g, aber einige SQL Server 2005-2008) und habe begonnen, einige ziemlich komplexe Ansichten für den Rest des Analystenteams zu erstellen.

Sie laufen meistens alle recht gut, aber einige von ihnen nicht so gut. Damit...

  • Wie lerne ich, meine Abfragen zu optimieren?
  • Muss ich lernen, Ausführungspläne zu lesen / zu befolgen?

Und...

  • Welche Bücher / Websites können Sie empfehlen, um mehr über die Optimierung von SQL-Abfragen zu erfahren 1) allgemein 2) speziell für Oracle 11g?

Wir haben hier einige gute Datenbankadministratoren, aber sie sind einfach zu überfüllt, um uns bei der Optimierung jeder von uns geschriebenen Abfrage zu helfen.

Die meisten Bücher, die ich bei Amazon für Oracle gefunden habe, scheinen alle auf die allgemeine Datenbankoptimierung ausgerichtet zu sein und / oder wurden vor 8 bis 10 Jahren geschrieben.

Vielen Dank für Ihren Rat :)


Antworten:


7

Ich würde sagen, dass das Erlernen des Verstehens von Erklärungsplänen eine wichtige Fähigkeit ist, um SQL-Anweisungen zu optimieren. Ich habe Christian Antogninis Buch " Fehlerbehebung bei der Oracle-Leistung" als sehr nützlich empfunden, um zu beschreiben, wie diese funktionieren, und um zu erklären, wie die Datenbankoptimierung angegangen werden kann. Während Sie ein paar Jahre alt sind, werden Sie immer noch viel lernen, was immer noch relevant ist.

Wenn Sie weiter fortgeschritten sind, können Sie sich die Bücher von Jonathan Lewis ansehen, aber diese sind ausführlicher und daher wahrscheinlich kein guter Ausgangspunkt. Kostenbasierte Oracle Fundamentals sind mittlerweile ziemlich alt, aber vieles davon ist immer noch relevant. Ich habe Oracle Core: Essential Internals zur Fehlerbehebung noch nicht gelesen , aber es hat gute Bewertungen von der Oracle-Community erhalten.

Wenn Sie Fragen haben, die länger als ein paar Sekunden dauern, würde ich auf jeden Fall empfehlen, sich den Echtzeit-SQL-Monitor anzusehen (vorausgesetzt, Sie sind entsprechend lizenziert). Wie der Name schon sagt, wird der Fortschritt einer SQL-Anweisung in Echtzeit angezeigt. Dabei wird aufgeschlüsselt, wie lange jede Operation mit Details der bisher abgerufenen Zeilen gedauert hat. Außerdem werden Details zu kürzlich ausgeführten Abfragen für kurze Zeit gespeichert, damit Sie sehen können, wie sich Ihre Änderungen auf eine Anweisung auswirken.

Dokumentation zu Oracle SQL Monitoring: http://docs.oracle.com/cd/E11882_01/server.112/e16638/instance_tune.htm#PFGRF94543

Das Erlernen des Optimierens von Abfragen erfordert Zeit und Übung. Ein paar Dinge, die ich gelernt habe:

  • Schreiben Sie Abfragen, um so schnell wie möglich so wenige Zeilen wie möglich abzurufen (z. B. möchten Sie eine 10-Millionen-Zeilentabelle nicht vollständig scannen, wenn Sie nur 100 Zeilen benötigen).
  • Stellen Sie sicher, dass die Anzahl der Zeilen, die in jedem Schritt eines erklärenden (erwarteten) Plans erwartet werden, mit der im tatsächlichen Ausführungsplan zurückgegebenen übereinstimmt. Wenn diese Größenordnungen unterschiedlich sind, wählt der Optimierer wahrscheinlich nicht den "besten" Plan.
  • Verstehen Sie die Prinzipien einer guten Indizierung: Wie sie funktionieren und wann sie bei der Ausführung einer Abfrage verwendet werden sollten / nicht ( Richard Foote hat einen sehr ausführlichen Blog, in dem Indizes in Oracle behandelt werden).

Meistens lernen Sie, indem Sie Abfragen schreiben, die (erwarteten) Erklärungspläne betrachten und diese mit den tatsächlichen Ausführungsplänen vergleichen (entweder durch Verfolgen der Abfrage oder Verwenden des SQL-Monitors). Schreiben Sie dann die Abfrage neu, fügen Sie Indizes hinzu / entfernen Sie sie usw. und sehen Sie, wie sich dies auf die Pläne und Ausführungszeiten auswirkt


1

Wenn Sie nach Oracle-spezifischen Informationen suchen, würde ich den Ask Tom- Blog bei Oracle empfehlen . Im Allgemeinen denke ich, dass Sie den Rat finden werden, die Abfrage nicht zu optimieren. Sie erhalten gute Ratschläge zum Schreiben einer Abfrage, die der Optimierer optimieren kann. Die Oracle-Dokumentation ist ebenfalls online , und ich suche dort normalerweise nach aktuellen Informationen zu Oracle. Ich habe nicht mit SQLServer gearbeitet, daher habe ich keine Empfehlungen dafür.

Ich habe in den letzten Jahren nicht viel Neues im Bereich der Optimierung von Abfragen gesehen. Die große Änderung ist die Ablehnung des regelbasierten Optimierers, mit dem ich mich kaum erinnern kann. Ich verstehe jedoch, dass SQLServer immer noch ein regelbasiertes Optimierungsprogramm verwendet, sodass das Verständnis seiner Regeln hilfreich sein kann.

Ein Tool, mit dem Sie eine Abfrage bearbeiten, ausführen und einen Erklärungsplan erstellen können, hilft zu verstehen, mit welchen Änderungen Sie eine Abfrage erhalten, die eine gute Leistung erbringt. Ich habe mit AquaData Studio gute Ergebnisse erzielt und mag die Baumansicht sehr. SQL Developer sollte dies ebenfalls tun.

Wie bei jeder Optimierung benötigen Sie quantitative Daten zur Leistung. Dann können Sie feststellen, ob Sie es tatsächlich optimiert haben.

Wie eine Abfrage optimiert wird, hängt teilweise davon ab, wie der Parser die Abfrage erstellt und optimiert. In größerem Umfang hängt dies von der Verteilung der Daten ab, die Sie abfragen. Wenn in einer Oracle-Datenbank die Ergebnismenge vier Prozent oder mehr einer Tabelle ausmacht und zufällig verteilt ist, ist ein Tabellenscan normalerweise schneller als ein Index.

Ich habe daran gearbeitet, Abfragen für ein Entwicklerteam zu optimieren. Nur zwei oder drei Abfragen pro Jahr erforderten eine ernsthafte Optimierung. Die meisten Abfragen sind so einfach, dass sie nicht optimiert werden müssen. Der Rest kann normalerweise durch Hinzufügen fehlender Verknüpfungspfade erledigt werden.

Für Oracle gibt es drei einstellbare Einstellungen, die die Leistung erheblich beeinträchtigen können. Die Kosten für Index- und Daten-Lookups interagieren, um die Bedingungen zu ändern, unter denen ein In-Index verwendet wird oder nicht. Diese beiden können pro Sitzung eingestellt werden. Die Standardeinstellungen sind oft nicht optimal. Der andere Wert steuert, wie viele Alternativen der Optimierer versuchen wird. Das Erhöhen dieses Wertes hilft oft.

Die Optimierung wird erheblich von der Datenverteilung und dem Datenvolumen beeinflusst. Verwenden Sie bei der Optimierung am besten eine Kopie der Produktionsdatenbank oder zumindest eine Datenbank mit derselben Datenverteilung und demselben Volumen. Ich habe die Testumgebung stark beschädigt und eine Abfrage für die Fertigungsauftragsdatenbank optimiert. Die Test- und Entwicklungsdatenbanken hatten eine signifikant unterschiedliche Datenverteilung, was dazu führte, dass die Abfrage auch mit deutlich weniger Daten fehlschlug.


Vielleicht möchten Sie hier mehr Substanz einbringen. Dies ist eigentlich die Grenzlinie "keine Antwort", wie es derzeit steht.
JNK
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.