4 Stimmen

Nicht in der Lage, Ergebnisse aus einer großen Tabelle abzurufen

Ich stelle eine sehr einfache Abfrage gegen eine Tabelle mit 15.000.000 Zeilen aus. Ich erlebe ein unberechenbares Verhalten bezüglich der rownum Grenzen.

Zum Beispiel funktioniert die folgende Abfrage ohne Probleme:

select * from (select * from my_table order by id) where rownum < 2000000

sowie auch diese:

select * from (select * from my_table order by id) where rownum between 1 and 15

aber diese hier wird nie abgeschlossen:

select * from (select * from my_table order by id) where rownum between 2 and 15

Ich kann dieses Verhalten nicht erklären: Wenn die untere Grenze 0 beträgt, kann die obere Grenze riesig sein, ohne Probleme zu verursachen. Aber wenn die untere Grenze nur zwei beträgt, wird die Abfrage nie abgeschlossen. Es ist auch seltsam, dass es keine Zwischenlösung gibt: Es wird entweder fast sofort zurückgegeben oder es wird nie fertig.

Die Tabelle ist indiziert nach der id Spalte und es handelt sich um einen asc-sortierten Index; ansonsten gehe ich davon aus, dass es zur Suche nach nur dem ersten Datensatz einen vollständigen Tabellenscan erfordern würde.

Wo sollte ich nachforschen, um dies zu beheben?

Mein Datenbank ist Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

2voto

mustaccio Punkte 17308

Wie @prezmyslawKruglej begann zu erklären, wird eine Bedingung where rownum > 1 niemals Datensätze zurückgeben. Es wird ausführlich von Tom Kyte beschrieben.

Ich schlage vor, die row_number() Funktion stattdessen zu verwenden, etwas wie

select ... from (
  select ..., row_number() over (order by whatever) as rn from ...
) where rn between 10 and 20

2voto

Donato Szilagyi Punkte 4229

Versuchen Sie dies:

SELECT * FROM (
    SELECT /*+ FIRST_ROWS */ myquery.*, ROWNUM rnum
    FROM (
        SELECT * FROM mytable ORDER BY id
    ) myquery
    WHERE ROWNUM <= 15
) WHERE rnum >= 2;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X