Samstag, Juli 13, 2013

TOP n queries in Oracle 12c

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.

2 Kommentare:

  1. This query can also be extended by using a code which helps the DBA to improvise it accordingly,
    as this was also mentioned in ORACLE FORUMS which helped me a lot for solving queries.

    AntwortenLöschen
    Antworten
    1. Hello Eva,
      thank you for your comment. Could you elaborate which code on the linked website you have in mind?

      Löschen