Frage Paging mit Oracle


Ich bin mit Oracle nicht so vertraut, wie ich es gerne wäre. Ich habe einige 250k Datensätze und möchte sie 100 pro Seite anzeigen. Derzeit habe ich eine gespeicherte Prozedur, die alle viertel Millionen Datensätze in einem Dataset mithilfe eines Datenadapters und Datasets abruft, und die dataadapter.Fill (Dataset) -Methode für die Ergebnisse aus dem gespeicherten proc. Wenn ich "Seitenzahl" und "Anzahl der Datensätze pro Seite" als ganzzahlige Werte habe, die ich als Parameter übergeben kann, was wäre der beste Weg, um genau diesen bestimmten Abschnitt zurückzubekommen. Sagen wir, wenn ich 10 als Seitennummer und 120 als Anzahl von Seiten übergebe, würde ich aus der Select-Anweisung den 1880. bis 1200. oder so etwas erhalten, meine Mathematik in meinem Kopf könnte ausfallen.

Ich mache das in .NET mit C #, dachte, das ist nicht wichtig, wenn ich es richtig auf die SQL-Seite bringen kann, dann sollte ich cool sein.

Update: Ich konnte Brians Vorschlag verwenden, und es funktioniert großartig. Ich möchte an einer Optimierung arbeiten, aber die Seiten kommen in 4 bis 5 Sekunden statt einer Minute, und meine Paging-Kontrolle konnte sich sehr gut mit meinen neuen gespeicherten Procs integrieren.


74
2017-10-27 22:37


Ursprung


Antworten:


So etwas sollte funktionieren: Aus Frans Boumas Blog 

SELECT * FROM
(
    SELECT a.*, rownum r__
    FROM
    (
        SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
        ORDER BY OrderDate DESC, ShippingDate DESC
    ) a
    WHERE rownum < ((pageNumber * pageSize) + 1 )
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)

117
2017-10-27 22:46



Frag Tom auf Seitennummerierung und sehr, sehr nützliche analytische Funktionen.

Dies ist ein Auszug aus dieser Seite:

select * from (
    select /*+ first_rows(25) */
     object_id,object_name,
     row_number() over
    (order by object_id) rn
        from all_objects)
    where rn between :n and :m
        order by rn;

114
2017-10-27 22:57



Im Interesse der Vollständigkeit, für Menschen auf der Suche nach einer moderneren Lösung, in Oracle 12c Es gibt einige neue Funktionen, einschließlich besserem Paging und Top-Handling.

Paging

Das Paging sieht so aus:

SELECT *
FROM user
ORDER BY first_name
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;

Top-N-Einträge

Die besten Datensätze zu erhalten, sieht folgendermaßen aus:

SELECT *
FROM user
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY

Beachten Sie, wie beide obigen Abfrage-Beispiele haben ORDER BY Klauseln. Die neuen Befehle respektieren diese und werden auf den sortierten Daten ausgeführt.

Ich konnte keine gute Oracle-Referenzseite finden FETCH oder OFFSET aber diese Seite hat einen tollen Überblick über diese neuen Funktionen.


42
2018-04-28 19:04



Ich möchte nur die Antworten und Kommentare zusammenfassen. Es gibt eine Reihe von Möglichkeiten für die Paginierung.

Vor Oracle 12c gab es keine OFFSET / FETCH-Funktionalität, schauen Sie sich also an weißes Papier wie der @jaskon vorgeschlagen hat. Es ist der vollständigste Artikel, den ich über verschiedene Methoden mit detaillierter Erklärung der Vor- und Nachteile gefunden habe. Es würde viel Zeit kosten, sie hier zu kopieren, also werde ich es nicht tun.

Es gibt auch einen guten Artikel von jooq-Erstellern, in dem einige gängige Vorbehalte mit der Paginierung von Orakeln und anderen Datenbanken erläutert werden. jooqs Blogpost

Gute Neuigkeiten, seit Oracle 12c haben wir eine neue OFFSET / FETCH-Funktionalität. OracleMagazine 12c neue Funktionen. Siehe "Top-N-Abfragen und Paginierung"

Sie können Ihre Oracle-Version überprüfen, indem Sie die folgende Anweisung ausführen

SELECT * FROM V$VERSION

6
2017-11-03 11:32



Versuche Folgendes:

SELECT *
FROM
  (SELECT FIELDA,
    FIELDB,
    FIELDC,
    ROW_NUMBER() OVER (ORDER BY FIELDC) R
  FROM TABLE_NAME
  WHERE FIELDA = 10
  )
WHERE R >= 10
AND R   <= 15;

über [teknicume]


5
2017-12-16 17:33