Randolf Geist erläutert in seinem Blog die Cardinality-Schätzungen des CBO für Gruppierungen mit einer HAVING clause. Während die Kalkulation für GROUP BY in vielen (aber längst nicht allen) Fällen recht solide sind, kommen beim HAVING immer default-Werte ins Spiel, was natürlich zu recht unerfreulichen Resultaten führen kann. Problematisch wird der Effekt vor allem dann, wenn die Gruppierung nicht am Ende der auszuführenden Operationen steht und von ihr weitere Schritte abhängen (was sich z.B. auch durch GROUP BY PLACEMENT-Transformationen ergeben kann), die dann auf fehlerhaften Cardinalities beruhen. Als Workaround für das im Artikel vorgestellte Problem kommen die (nicht dokumentierten, aber immer wieder nützlichen) Hints CARDINALITY und OPT_ESTIMATE in Frage, die aber natürlich das Wissen um die tatsächliche Größe der Ergebnismenge voraussetzen - und in Produktionssystemen in der Regel nichts zu suchen haben - oder die Verwendung eines zusätzlichen ROWNUM-Prädikates, das das Pushing der Bedingung einer rahmenden Query als HAVING-caluse in die umrahmte View verhindert; wobei diese Variante dann wiederum andere Schwierigkeiten hervorrufen kann.
Keine Kommentare:
Kommentar veröffentlichen