Tony Hasler weist in seinem Artikel Aggregate Functions and Sorts darauf hin, dass nicht jede aggregierende Funktion tatsächlich eine Sortierung durchführt - worauf auch Jonathan Lewis gelegentlich hingewiesen hat, wozu mir allerdings ein Link fehlt. Um die Sortierung zu vermeiden, merkt sich Oracle für entsprechende Funktionen jeweils den geeignetsten bisher gefundenen Wert und ersetzt ihn durch den aktuellen Wert, wenn dieser geeigneter ist. Eine solche Funktion wäre MAX, bei der im Rahmen des table scans für jeden Wert geprüft wird, ob er größer als das bisher gefundene Maximum ist. Im Ausführungsplan erscheint in einem solchen Fall ein Schritt SORT AGGREGATE, der somit eigentlich keine Sortierung darstellt (was man in v$mystat oder v$sesstat überprüfen kann). Ähnliches gilt für HASH GROUP BY: auch diese Operation erfordert keine Sortierung.
In einem weiteren Artikel FIRST/LAST versus FIRST_VALUE/LAST_VALUE erläutert Tony Hasler das Verhalten der angesprochenen Funktionen und erklärt, dass in der Regel FIRST und LAST die in Hinblick auf Ergebnis und Performance geeigneteren Varianten sind.
Keine Kommentare:
Kommentar veröffentlichen