Zur Vereinfachung der Handhabung von Paginierungs-Queries bietet Oracle 12c eine recht handliche neue Syntax an, in deren Zentrum das Schlüsselwort FETCH steht, das hinter der ORDER BY Klausel folgt und den Abschnitt der Ergebnismenge definiert, der geliefert werden soll. Bei
Tim Hall findet man - wie üblich - eine detaillierte Beschreibung des Features, inclusive übersichtlicher Beispiele. Einige der einfachsten Fälle wären:
-- 12.1.0.1
drop table t;
create table t
as
select rownum id
from dual
connect by level <= 20;
-- liefert nur die ersten fünf Datensätze
select id
from t
order by id
fetch first 5 rows only;
ID
----------
1
2
3
4
5
-- überspringt fünf Datensätze und
-- liefert danach die folgenden fünf Datensätze
select id
from t
order by id
offset 5 rows fetch first 5 rows only
ID
----------
6
7
8
9
10
-- liefert die ersten 20% der Datensätze
select id
from t
order by id
fetch first 20 percent rows only
ID
----------
1
2
3
4
Jonathan Lewis hat sich mit der internen Implementierung des Features beschäftigt und via CBO Trace die intern erzeugte Query bestimmt, die in solchen Fällen abgesetzt wird, und die neben den abgefragten Daten noch ein paar einfache analytische Funktionen (count, row_number, rank) enthält, die die Auswahl des gewünschten Abschnitts möglich machen. Es handelt sich also auch in diesem Fall nicht um schwarze Magie, sondern nur um eine syntaktische Abkürzung - was das Feature aber nicht weniger nützlich macht. Oder wie der Herr Lewis schreibt:
Oracle is basically taking a nice, easily readable syntax, and converting it behind the scenes to the sort of SQL we would once have written by hand. (That’s a good thing, of course – clarity of code does protect you from accidents, and it’s best if messy rewrites are handled by machines rather than error-prone people).
Zusätzlich hat Jonathan Lewis dann auch noch einen Artikel zum Verhalten des Features unter dem
Einfluss von Parallelisierung geschrieben, der zeigt, dass die Verteilung der Arbeit auf die Slaves unter Umständen recht unausgewogen sein kann.