Ich verwende Oracle 11.2 und versuche, eine Auslagerungsabfrage auf einer Tabelle mit Millionen von Zeilen darin zu schreiben. Wenn ich andere Artikel lese, denke ich, dass ich den besten Ansatz gefunden habe, aber es verlangsamt sich, je höher die Seitenzahl ist.Oracle Paging auf große Tabelle mithilfe der Liste der Primärschlüssel
Das ist meine Lösung. Zuerst erhalte ich eine Liste von Primärschlüsselwerten (ID) für diese Datenseite. Ich bekomme dann alle anderen Tabellendaten, die diesen IDs entsprechen. Dies läuft jedoch immer noch langsam.
SELECT *
FROM mytable
WHERE ID IN (
SELECT ID
FROM (
SELECT ID, ROWNUM rnum
FROM (
SELECT ID
FROM mytable
ORDER BY ID
) results
WHERE ROWNUM <= 1000010
)
WHERE rnum >= 1000001
)
Ausführungszeit: 30+ Sekunden.
Wenn ich die innere Abfrage separat tun und manuell die IDs der äußeren Abfrage übergeben, es ist viel schneller:
SELECT ID
FROM (
SELECT ID, ROWNUM rnum
FROM (
SELECT ID
FROM mytable
ORDER BY ID
) results
WHERE ROWNUM <= 1000010
)
WHERE rnum >= 1000001
Execution Time: 0.2 seconds.
Results:
2134696,
2134697,
2134692,
2134693,
2134694,
2134695,
2134698,
2134699,
2134700,
2134701
SELECT *
FROM mytable
WHERE ID IN (
2134696,
2134697,
2134692,
2134693,
2134694,
2134695,
2134698,
2134699,
2134700,
2134701
)
Execution Time: 0.03 seconds.
Die erste Abfrage sollte so schnell wie die anderen 2 zusammen, aber es ist viel langsamer.
Kann jemand erklären, warum dies ist und eine bessere Lösung vorschlagen?
Danke für die Antwort. Ich begann mit Ihrer Abfrage, aber es dauerte wiederum 30 Sekunden, um Ergebnisse zu liefern. Der schnellste Weg zur Zeit für meine Lösung ist, zuerst die Liste der IDs zu erhalten und dann eine separate Abfrage auszulösen, um die zugehörigen Daten zu erhalten. Es scheint mir verrückt, aber es funktioniert. Ich nehme an, dass Oracle 12 dies besser handhabt. – markvpc
@markvpc Haben Sie einen Index für die Spalte 'ID'? – MT0
Ja, es ist die Primärschlüsselspalte und ist sehr schnell zu holen. Das Problem tritt auf, wenn andere Daten in dieser Tabelle abgerufen werden. – markvpc