
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.
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.
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.

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.
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.