Oracle-Paging: Analytische Funktion ROW_NUMBER() VS ROWNUM
Beim Paging getan werden muss, um in einer web-site... Welche Methode besser abschneidet?
Analytische Funktion ROW_NUMBER()
- Oracle 10G
- http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o17asktom-093877.html
SELECT columnA, columnB FROM (SELECT columnA, columnB, row_number() over (order by columnB) rn FROM table) WHERE rn BETWEEN LOW_LIMIT AND OFFSET;
ROWNUM
- http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o56asktom-086197.html
- INMHO ich finde dieses Vorgehen mehr Menschen lesbaren code
SELECT * FROM ( SELECT rownum rn, a.* FROM( SELECT columnA, columnB FROM table ORDER BY columnB ) a WHERE rn <= OFFSET ) WHERE rnum >= LOW_LIMIT
- Hinweis: ich verstehe, dass es RANK und DENSE_RANK-Analyse-Funktionen, aber können davon ausgehen, ich muss nur Seite durch deterministische Abfragen.
- Hinweis 2: Zum abrufen der Gesamt-Menge der Datensätze, ich bin am überlegen in der Verwendung eines separaten einfachen Abfrage count(*)
Wie viele Zeilen werden Sie den Umgang mit? Hast u überprüfen, erklären plan?
mögliche Duplikate von Wie kann ich speed up row_number in Oracle?
Versuchen Sie eine test-Tabelle mit einer großen Menge von Daten und test sowohl gegen ihn, voila, du hast deine Antwort, die ist (durch die Folge der Tatsache, Sie lief der test selbst), das ganz direkt auf die hardware/Netzwerk/Umgebung in der Sie ausgeführt werden.!
nun, da Sie erwähnen,... die Antwort auf diese Frage hat einen tollen Artikel link.
Gute zeigt in Tests HW/Net/Umgebung.
mögliche Duplikate von Wie kann ich speed up row_number in Oracle?
Versuchen Sie eine test-Tabelle mit einer großen Menge von Daten und test sowohl gegen ihn, voila, du hast deine Antwort, die ist (durch die Folge der Tatsache, Sie lief der test selbst), das ganz direkt auf die hardware/Netzwerk/Umgebung in der Sie ausgeführt werden.!
nun, da Sie erwähnen,... die Antwort auf diese Frage hat einen tollen Artikel link.
Gute zeigt in Tests HW/Net/Umgebung.
InformationsquelleAutor Jimmy | 2011-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich dachte, diese Frage war interessant, so ich versuchte ein paar Dinge aus.
Habe ich die Tabelle mit dem Namen large_t, enthält etwa 1,1 M Zeilen.
Dann habe ich zwei Fragen:
Und
Wenn man sich die Pläne der beiden Abfragen generieren, die erste hat eine operation:
Während die analytische query enthält eine operation namens
SORT ORDER BY STOPKEY ist eine mehr effiziente Art operation, die einen einfachen AUFTRAG. Ich bin nicht sicher, wie ein FENSTER SORTIEREN GESCHOBEN RANG funktioniert, aber es scheint zu funktionieren auf ähnliche Weise.
Blick auf v$sql_workarea denn die laufen beide Fragen, sowohl nur erforderlich, eine sort_area von 4096 bytes.
Im Gegensatz dazu, wenn ich lief die Abfrage ohne eine paging-Abfrage:
Dann die Art Fläche, die benötigt wird, 37M, beweist die Art in beiden Abfragen ist etwa die gleiche.
Normalerweise, wenn Sie wollen, um effizient die Rückkehr der TOP-N einer Abfrage sortiert, Sie wollen einen index auf die Spalte Sortieren - das wird verhindern, dass Oracle benötigen, um Art überhaupt. Also, ich habe einen index auf OBJECT_ID, und erklärte dann beide Abfragen wieder.
Dieser Zeit die erste Abfrage verwendet den index und kehrte in 0,2 Sekunden, während die zweite Abfrage haben nicht mit dem neuen index und war viel langsamer.
Also mein Fazit aus dieser schnellen bit-Analyse ist, dass im Allgemeinen Fall mit rownum-filtern oder der analytischen row_number-Funktion führen beide über das gleiche. Jedoch, die rownum Beispiel automatisch begann mit dem index I auf dem Tisch erzeugt, wenn row_number nicht. Vielleicht konnte ich Sie zum verwenden des index mit einigen hinweisen - das ist etwas anderes, mit dem Sie Experimentieren können.
InformationsquelleAutor Stephen ODonnell
Abgesehen von den anderen Unterschiede erwähnt in den Antworten, Sie sollten sich auch überlegen, Leistung. Es ist eine nicht verbindliche, aber sehr interessanter Bericht hier, vergleichen verschiedene Möglichkeiten der Paginierung, unter denen die Benutzung von
ROWNUM
im Vergleich zuROW_NUMBER() OVER()
:https://web.archive.org/web/20160901191310/http://www.inf.unideb.hu:80/~gabora/pagination/results.html
Wie hat Sie es nicht finden? 🙂 Trotzdem, danke für den Hinweis. Ich habe aktualisiert die Antwort
InformationsquelleAutor Lukas Eder
Generieren einer eigenen empirischen Ergebnisse:
Natürlich, erhöhen Sie die Größe der Tabelle für Ihre Testzwecke!
Set timing on und ausführen von Abfragen gegen den großen Tisch.
Ändern Sie die Struktur der Tabelle, um besser an Ihr testen, wie Sie möchten können einige Spalten indiziert werden, die für Ihre Abfrage zu etc. aber im wesentlichen ist es ein einfacher test, und wird nicht lange dauern, zu laufen.
Wenn beide kommen in etwa die gleichen timings verwenden Sie dann die meisten lesbar (und damit erträglich) version.
InformationsquelleAutor Ollie