Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie man SQL-Tuning in Oracle durchführt

Einführung in die SQL-Optimierung

  • SQL-Anweisungen werden geschrieben, um Daten aus der Datenbank abzurufen/abzurufen. Wir möchten, dass unsere SQL-Anweisung schnell ausgeführt wird (SQL-Tuning) und die Ergebnisse in Sekunden liefert.
  • Ein schlecht gestaltetes SQL kann den gesamten Datenbankbetrieb verlangsamen und den gesamten Betrieb zum Erliegen bringen. Es ist viel schwieriger, effizientes SQL zu schreiben, als funktional korrektes SQL zu schreiben. SQL-Leistungsoptimierung kann den Zustand und die Leistung eines Systems erheblich verbessern.
  • Der Schlüssel zum Optimieren von SQL besteht darin, die Daten zu minimieren, auf die zugegriffen wird, um das Ergebnis bereitzustellen. Wir können die Daten, auf die es zugreift, minimieren, um das Ergebnis über einen optimalen Suchpfad bereitzustellen.

Ein einfaches Beispiel wäre

select * from dept where emp=10
  • Jetzt muss diese Abfrage die gesamte Tabelle dept durchsuchen, um die Daten herauszufinden, bei denen emp=10 ist. Es muss also auf die vollständige Tabelle zugreifen
  • Wenn wir jetzt den Index für die emp-Spalte erstellen, kann es einfach auf den Index zugreifen und das Ergebnis abrufen. Hier greift es also auf die weniger Daten zu

12 Schritte zur SQL-Optimierung in Oracle

Hier die allgemeinen Tipps zur SQL-Leistungsoptimierung

(1) Zunächst müssen Sie über alle erforderlichen Tools für die SQL-Optimierung verfügen. Sie müssen über gute Informationen zum Tracing, zum Formatieren des Trace, zum Erklärplan und zum Lesen des Erklärplans in Oracle verfügen.
Gute Kenntnisse über die verschiedenen verfügbaren Join-Methoden Oracle und wie man sie effizient nutzt

(2) Lesen Sie weniger Daten und seien Sie E/A-effizient.
Je mehr Daten Sie für die SQL-Anweisung lesen, desto mehr Latches müssen erfasst werden, und die Leistung wird verringert. Daher muss es immer weniger logische Lesevorgänge durchführen. Überprüfen Sie die Anzahl der Zeilen in verschiedenen beteiligten Tabellen und finden Sie die beste Methode zum Erstellen der SQL-Anweisung heraus

(2) Verwenden Sie gute Oracle-Indizes
B-Tree-Indizes und Bitmap-Indizes können verwendet werden, um die Leistung der Abfragen zu erhöhen, wenn die zurückgegebenen Daten weniger als 10 % betragen. Aber wir müssen beim Erstellen des Index vorsichtig sein, da er auch für Einfüge-, Aktualisierungs- und Löschvorgänge gepflegt werden muss. Das Erstellen eines Index verursacht also Overhead für viele Dinge. Daher müssen wir die Auswirkung der Indexerstellung sorgfältig prüfen.

(3) Vermeiden Sie sql, die die Verwendung von index

deaktivieren

SQL, das Indizes deaktiviert
(a)Funktionen ( to_char(), to_date() usw. )
Fix :Funktion auf die Seite „Konstante/Variable binden“ verschieben
(b) Type Casting
In SQL
wobei emp_no =10 (emp_no ist ein varchar2)
In PL/SQL
wobei emp_no =v_emp_num (v_emp_num ist eine Zahl)
Modifikatoren
und id + 0 =111
und Datum + 1 =sysdate (versuchen Sie date =sysdate – 1)
Fix :Ändern Sie es, um es zu vermeiden


(4) Verwenden Sie in der Anwendung immer eine Bind-Variable. Wenn Sie die Bind-Variable nicht in Oracle verwenden, wird die SQL jedes Mal analysiert und wirkt sich auf die Datenbankleistung aus. Wenn sie die Bind-Variable enthält, wird die SQL zwischengespeichert und die weitere Ausführung erfordert keine Analyse und somit wird die Gesamtleistung des Systems verbessert

(5) UNION vs. OR. Verwenden Sie UNION für Abfragen mit zwei eindeutigen Ausführungspfaden; jeder gibt eine ziemlich kleine Anzahl von Zeilen zurück. Verwenden Sie Union nicht für Abfragen, die wahrscheinlich eine große Anzahl von Zeilen zurückgeben, da alle Zeilen sortiert werden müssen und die meisten von ihnen verworfen werden. OR neigt dazu, den Index zu deaktivieren

(6) Verwenden Sie die genauen Optimierungsstatistiken in der Tabelle, um den optimalen Plan zu erhalten.

(7) Wenn Sie eine Funktion für einen Ausdruck für die Bedingung verwenden, überprüfen Sie, ob es einen funktionsbasierten Index für diese Spalte gibt. Wenn es nicht vorhanden ist, wird der Index nicht verwendet

(8) Verwenden Sie existiert vs. in und Nicht existiert vs. nicht in für korrelierte Unterabfragen

(9) Vermeiden Sie schlechte Programmierpraktiken
Einige Tipps
(a) Vermeiden Sie kartesische Verknüpfungen . Stellen Sie sicher, dass alle in den Abfragen erforderlichen Tabellen benötigt werden und miteinander verknüpft sind
(b) Verwenden Sie Decode, um mehrere Aufrufe der Datenbank zu vermeiden
(c) Versuchen Sie, Outer Join zu vermeiden
(d ) Manchmal beschleunigt das Zerlegen der Logik in kleine Teile die Arbeit

(10) Wenn Sie versuchen, die komplexe Ansicht zu verwenden, überprüfen Sie, ob die Basistabellen stattdessen verwendet werden können, da die Ansicht dazu neigt, die Leistung zu beeinträchtigen

(11) Verwenden Sie UNION ALL Vs UNION, wenn Sie wissen, dass die abgerufenen Daten keine doppelten Zeilen enthalten werden

(12) Verwenden Sie Hinweise, um den Ausführungsplan zu optimieren. Manchmal kann ein Hinweis verwendet werden, um den Ausführungsplan für die Abfrage zu ändern, um den optimalsten Pfad zu wählen.
Manchmal führt das Einsehen von Bindungen zu einem schlechten Plan, sodass in diesem Fall das Einfügen des erforderlichen Hinweises zum Korrigieren des Plans hilfreich ist, um den Plan zu erhalten immer gute Leistung
Die häufigsten Hinweise sind
/*+ LEADING (Tabellen-Alias) */ gibt die Tabelle an, bei der die Verknüpfung beginnen soll
/*+ FIRST_ROWS */ sehr gut für Online screens – begünstigt NESTED LOOPS
/*+ INDEX (Tabellenalias.Indexname) */ gibt den Index an, den Sie verwenden möchten. Hinweis:Wenn der Index gelöscht und neu erstellt wird und sich der Name ändert, ist der Hinweis nicht mehr gültig.
/*+ USE_NL (Tabellenalias 1, Tabellenalias 2)*/ fordert den Optimierer auf, den Nested Loop Join für die beiden angegebenen Tabellen zu verwenden

Vermeiden Sie unnötige Optimierungshinweise und verwenden Sie sie mit Bedacht

Dies sind einige der Tipps, um Probleme zu vermeiden und das SQL-Tuning durchzuführen. SQL-Tuning ist ein großer Ozean, und Sie können Dinge nur durch Üben lernen. Viel Glück!!

Liest auch
https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm