Dieser Abschnitt enthält die create
und insert
Anweisungen um die Beispiele aus Kapitel 6, „Sortieren und Gruppieren“ in einer Oracle Datenbank durchzuführen.
Indexed Order By
SELECT sale_date, product_id, quantity
FROM sales
WHERE sale_date >= TRUNC(sysdate) - INTERVAL '1' DAY
ORDER BY product_id
Nach dem ändern von Indizes, kann man auch die Statistiken aktualisieren:
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(null, 'SALES',
METHOD_OPT=>'for all indexed columns', CASCADE => true);
END;
/
Indexed Group By
Die Oracle Datenbank (mindestens 11g-19c) hat ein Problem, wenn die order by
-Klausel die umgekehrte Indexreihenfolge benötigt.
SELECT product_id, sum(eur_value)
FROM sales
WHERE sale_date = TRUNC(sysdate) - INTERVAL '1' DAY
GROUP BY product_id
ORDER BY product_id DESC;
Obwohl ein INDEX RANGE SCAN DECENDING
die Zeilen in einer Vorsortierten Reihenfolge liefert, die für ein pipelined order by
geignet wäre, wird ein explizites Sort ausgeführt. Bei passender Sortierung entfällt das (NOSORT
).
SELECT product_id, sum(eur_value)
FROM sales
WHERE sale_date = TRUNC(sysdate) - INTERVAL '1' DAY
GROUP BY product_id
ORDER BY product_id ASC;