Die Bedingungen „IST NULL“ und „ODER“ können Sie behindern

Oracle
20/3/2024
Tomasz Chwasewicz
Bedingungen IS NULL und OR in SQL-Abfragen
Inhaltsverzeichniss

Wo die Bedingung „IST NULL“ oder „ODER“ unkontrolliert wütet, geraten Abfragen oft in ein Performance-Kaninchenloch — ein Ort, an dem CPU-Zyklen schneller brennen als der Schweif eines Kometen und I/O-Operationen sich im Frühjahr mit rasender Inbrunst vermehren.

Der Zweck dieses Textes ist klar: Datenbankexperten zu einer schnelleren und effizienteren Ausführung von Abfragen zu führen. Wir krempeln die Ärmel hoch, um uns mit den Gründen zu befassen, warum diese speziellen Muster die Leistung beeinträchtigen, und wir skizzieren Aktionsstrategien, um diese Hindernisse zu mildern.

„ODER“ == SCHLECHT, warum?

Wenn die „ODER“ -Bedingung in Abfragen zu häufig verwendet wird, kann dies zu mehreren Ineffizienzen führen. Eines der Hauptprobleme besteht darin, dass sie dazu führen kann, dass die Abfrage von Oracle wiederholt ausgewertet wird, und zwar einmal für jede Bedingung, getrennt durch „ODER“. Das liegt daran, dass „ODER“ Ihre Suchkriterien effektiv erweitert. Dies kann verhindern, dass die Datenbank Indizes effektiv verwendet. Dadurch kann Oracle statt eines einzigen, effizienten Pfads zum Abrufen der erforderlichen Daten größere Teile einer Tabelle oder eines Indexes scannen. Dies führt zu einer erhöhten I/O- und CPU-Auslastung und folglich zu einer langsameren Abfrageleistung.

Darüber hinaus können Abfragen, die mit mehreren „ODER“ -Begriffen „angereichert“ sind, schwieriger zu lesen und zu verwalten sein. Durch das Hinzufügen weiterer Bedingungen geht die Transparenz verloren, was es schwierig macht, die Absicht der Abfrage auf einen Blick zu verstehen.

Abfrageoptimierung: Lassen Sie uns vom „ODER“ weggehen

Die „IN“ -Bedingung bietet eine präzise und effiziente Möglichkeit, mehrere Werte in einer Spalte zu finden. Im Vergleich zur Kombination mehrerer „ODER“ -Bedingungen kann „IN“ die Komplexität der Abfrage erheblich reduzieren und ihren Ausführungsplan verbessern. Betrachten Sie beispielsweise den Unterschied zwischen diesen beiden Ansätzen:

Verwendung von „OR“:
WÄHLEN* AUS MITARBEITERN
WO Abteilungs_ID = 10
ODER Abteilungs-ID = 20
ODER department_id = 30;

Mit „IN“:
WÄHLEN* AUS MITARBEITERN
WO department_id IN (10, 20, 30);

Beide Abfragen dienen zum Abrufen von Mitarbeiterdaten aus den Abteilungen 10, 20 und 30. Die „IN“ -Version ist jedoch nicht nur besser lesbar, sondern ermöglicht es Oracle Query Optimizer auch, Indizes effizienter zu verwenden und möglicherweise die Anzahl der zum Abrufen der angeforderten Daten erforderlichen Scans zu reduzieren.

Probleme mit „IS NULL“

wartości Null

Die Bedingung „IST NULL“ stellt eine Reihe anderer Herausforderungen dar. Dies ist in erster Linie aufgrund der Art und Weise problematisch, wie NULL-Werte von Oracle-Indizierungsmechanismen, insbesondere von B-TREE-Indizes, behandelt werden. In Oracle bedeutet ein Wert von NULL, dass keine Daten vorliegen. Dies mag zwar für einige Szenarien semantisch angemessen sein, führt jedoch zu Ineffizienzen bei der Abfrageverarbeitung.

B-TREE-Indizes speichern keine Einträge für Schlüssel, die als NULL dargestellt werden, was bedeutet, dass die Überprüfung der Abfragebedingung IST NULL diese Indizes nicht effektiv verwenden kann. Daher kann Oracle zur Erfüllung solcher Abfragen auf das vollständige Scannen von Tabellen zurückgreifen, was insbesondere bei großen Datensätzen zu Leistungseinbußen führt.

Gehen wir also von den Werten „Null“ und „IS NULL“ weg - Wie?

Die Grundlagen scheinen einfach zu sein. Wenn Sie den Wert kennen, lassen Sie mich ihn eingeben. Wenn Sie den Wert nicht kennen, geben Sie an, dass er unbekannt ist.

  • Standardwerte: Indem Sie einen Standardwert zuweisen, stellen Sie sicher, dass jeder Datensatz einen vorhersehbaren Wert hat, der effizient indexiert und durchsucht werden kann. Wenn beispielsweise in einer Spalte das Datum aufgezeichnet wird, an dem die Aktion ausgeführt wurde und die Aktion immer ausgeführt werden soll, kann die Indexleistung verbessert werden, wenn Sie ein Standarddatum (z. B. das Datum, an dem die Zeile erstellt wurde) festlegen, anstatt NULL-Werte zuzulassen.
  • Platzhalter für unbekannte Daten: In Fällen, in denen eine Spalte möglicherweise keinen aussagekräftigen Standardwert hat — z. B. optionale Benutzerinformationen — ist es sinnvoll, einen Platzhalterwert zu verwenden, um unbekannte oder nicht zutreffende Daten darzustellen. Dadurch werden NULL-Werte vermieden und sichergestellt, dass die Spalte indexfreundlich bleibt. Beispielsweise kann es effizienter sein, ein bestimmtes Datum zu verwenden, das weit in der Vergangenheit liegt, oder einen bestimmten Zeichenfolgenwert wie „UNKNOWN“ oder „N/A“ zu verwenden als NULL.
  • Feature-basierte Indizes: So heben sie sich hervor Babette Turner, die Verwendung funktionsbasierter Indizes kann eine effektive Strategie zur Optimierung von Abfragen sein, die NULL-Werte enthalten. Indem Sie einen Index für eine Funktion erstellen, die NULL-Werte in einen durchsuchbaren Schlüssel umwandelt, können Sie die Leistung des Indexes beibehalten. Nehmen wir zum Beispiel den auf NVL erstellten Index (mycolumn, 'ISNULL'). Er wandelt NULL-Werte in einen konstanten 'ISNULL'-Wert um, der effizient indexiert und durchsucht werden kann.

In Verbindung stehende Artikel