In seinem aktuellen Artikel Predicate Order erläutert und modelliert Jonathan Lewis ein Problem, das vor kurzem in einem OTN Thread vorgestellt wurde: abhängig von der Verwendung von IN oder NOT IN läuft eine Query in einen Fehler "ORA-01722: invalid number" oder wird erfolgreich verarbeitet. Das grundsätzliche Problem ist dabei - und das ist zunächst einmal keine Überraschung - die Wahl ungeeigneter Datentypen: in dem per IN oder NOT IN eingeschränkten Attribut finden sich nicht-numerische Werte, aber die Bedingung vergleicht mit numerischen Angaben. Der ORA-01722 tritt demnach in Abhängigkeit davon auf, ob die Datensätze mit den nicht numerischen Werten bereits durch andere Filterpredikate ausgeschlossen wurden oder nicht. Im OTN-Thread und in Jonathans Modellierung existiert neben dem IN/NOT IN-Prädikat noch eine Einschränkung auf einen Datums-Range, der diese vorangehende Filterung hervorrufen kann: im Fall des IN-Prädikats erwartet der Optimizer, dass dessen Einschränkung deutlich selektiver ist als die der Datums-Prädikate und wendet es deshalb als erstes an, was zum invalid-number-Fehler führt. Das NOT IN-Prädikat hält der Optimizer für deutlich weniger selektiv und verwendet es daher erst nach den Datums-Einschränkungen, wodurch die Query erfolgreich ablaufen kann. Explizit sichtbar ist diese Reihenfolge in der Predicate-Section des Execution Plan, denn die Filter-Prädikate eines Steps erscheinen dort in der Reihenfolge ihrer Anwendung. Im Beispiel des Artikels ist es durch geringfügige Änderungen der Datumseinschränkungen möglich, die Reihenfolge der Prädikatauswertung zu ändern, so dass alle sechs möglichen Reihenfolgen der Prädikate auftreten können, von denen jeweils die Hälfte zu einer erfolgreichen Ausführung und die andere Hälfte zu einem Fehler führen. Bis zu Release 10g war es möglich, die Auswertungsreihenfolge mit Hilfe des Hints ordered_predicates zu beeinflussen, aber dieser ist inzwischen deprecated. Das eigentliche Problem in diesem Zusammenhang ist natürlich die unpassende Definition von Datentypen, aber eine unglückliche Wahl der Reihenfolge der Prädikatauswertung kann wohl auch in Fällen mit weniger deutlichen Modellierungsfehlern auftreten.
Keine Kommentare:
Kommentar veröffentlichen