Franck Pachot hat im dbi Blog eine kleine Serie von Artikeln begonnen, in denen er eines der klassischen Anti-Pattern der SQL Entwicklung untersucht - generische Queries mit mehreren AND-verknüpften Bedingungen der Form:
column_value = NVL(:bindewert, column_value)
Diese Konstrukte dienen dazu, dem Anwender die Möglichkeit zu geben, eine Ergebnismenge durch eine Eingabe einzuschränken, wobei der Verzicht auf eine Eingabe keine Einschränkung nach sich ziehen soll. Von der Anwendungslogik her ist das durchaus plausibel, aber der Optimizer kann solche Queries nicht sinnvoll optimieren, da er zum Zeitpunkt der Planerstellung nicht wissen kann, welche Prädikate im Rahmen der Ausführung tatsächlich eingesetzt werden. Zur Serie gehören bislang folgende Artikel:
- Generic query for multicriteria search - part I: USE_CONCAT (OR Expansion): zeigt das grundsätzlich Problem anhand einer Beispielquery, in der vier derartige indizierte Attribute erscheinen. Der Optimizer erzeugt dazu einen - mehr oder minder plausiblen - Plan mit OR-Expansion. Für einige Parameter-Kombinationen ist dieser Plan geeignet, für andere eher nicht.
- Generic query for multicriteria search - part II: BIND_AWARE (Adaptive Cursor Sharing): untersucht das Verhalten der im ersten Artikel vorgestellten Query mit einem zusätzlichen BIND_AWARE Hint. Dabei werden (erwartungsgemäß) mehrere Cursor erzeugt - allerdings sind die Pläne alle weniger geeignet als es entsprechende Varianten für dynamisches SQL mit den tatsächlich vorgenommenen Einschränkungen wären. Auf Twitter hat Lothar Flatz in diesem Zusammenhang auf seine OTN-Idee eines Reoptimierungs-Hints hingewiesen, die ich für durchaus plausibel halte.
Der Autor hat weitere Artikel angedeutet, die ich wahrscheinlich hier ergänzen werde.
Keine Kommentare:
Kommentar veröffentlichen