Wie geht das LIMIT
in DB2 für iSeries?
Ich habe eine Tabelle mit mehr als 50.000 Datensätzen und möchte Datensätze von 0 bis 10.000 und Datensätze von 10.000 bis 20.000 zurückgeben.
Ich weiß, dass Sie in SQL LIMIT 0,10000
am Ende der Abfrage für 0 bis 10.000 und LIMIT 10000,10000
am Ende der Abfrage für 10000 bis 20.000 schreiben
Wie wird das in DB2 gemacht? Was ist der Code und die Syntax? (vollständiges Abfragebeispiel wird geschätzt)
db2
limit
ibm-midrange
elcool
quelle
quelle
Antworten:
Verwenden von
FETCH FIRST [n] ROWS ONLY
:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm
Um Bereiche zu erhalten,
ROW_NUMBER()
müssten Sie (seit v5r4) verwenden und dies innerhalb derWHERE
Klausel verwenden: (von hier gestohlen: http://www.justskins.com/forums/db2-select-how-to-123209.html )quelle
ROW_NUMBER
ist kein gültiges Schlüsselwort. Aber danke für den Link, es gab mir eine Idee und es funktioniert.Entwickelte diese Methode:
Sie BRAUCHEN eine Tabelle mit einem eindeutigen Wert, der bestellt werden kann.
Wenn Sie Zeilen zwischen 10.000 und 25.000 möchten und Ihre Tabelle 40.000 Zeilen enthält, müssen Sie zuerst den Startpunkt und die Gesamtzahl der Zeilen ermitteln:
int start = 40000 - 10000;
int total = 25000 - 10000;
Und übergeben Sie diese dann per Code an die Abfrage:
quelle
Die Unterstützung für OFFSET und LIMIT wurde kürzlich zu DB2 für i 7.1 und 7.2 hinzugefügt. Sie benötigen die folgenden DB PTF-Gruppenebenen, um diese Unterstützung zu erhalten:
Weitere Informationen finden Sie hier: OFFSET- und LIMIT- Dokumentation , DB2 for i Enhancement Wiki
quelle
Hier ist die Lösung, die ich gefunden habe:
Durch Initialisieren von LASTVAL auf 0 (oder '' für ein Textfeld) und anschließendes Setzen auf den letzten Wert in der letzten Gruppe von Datensätzen wird die Tabelle in Blöcken von N Datensätzen durchlaufen.
quelle
N
kleiner als die Anzahl identischer Werte in der Spalte ist (obwohl dies auch bei Verwendung zutrifftROW_NUMBER()
). Anfangswerte müssen ebenfalls sorgfältig ausgewählt werden - dies0
ist offensichtlich problematisch, wenn die Spalte einen negativen Wert enthält . Bei Nullen wäre Vorsicht geboten. Funktioniert nicht, wenn Seiten übersprungen werden.Die Lösung von @ elcool ist eine kluge Idee, aber Sie müssen die Gesamtzahl der Zeilen kennen (die sich sogar ändern können, während Sie die Abfrage ausführen!). Also schlage ich eine modifizierte Version vor, die leider 3 Unterabfragen anstelle von 2 benötigt:
wo
{last}
sollte durch die Zeilennummer des letzten Datensatzes ersetzt werden, den ich brauche, und{length}
sollte durch die Anzahl der Zeilen ersetzt werden, die ich brauche, berechnet alslast row - first row + 1
.Wenn ich beispielsweise Zeilen von 10 bis 25 (insgesamt 16 Zeilen) möchte,
{last}
ist dies 25 und{length}
25-10 + 1 = 16.quelle
Sie sollten auch die Klausel OPTIMIZE FOR n ROWS berücksichtigen. Weitere Details hierzu finden Sie in der DB2 LUW-Dokumentation in den Richtlinien zum Einschränken des Themas SELECT-Anweisungen :
quelle
Versuche dies
quelle
Es gibt zwei Lösungen, um eine DB2-Tabelle effizient zu paginieren:
1 - die Technik unter Verwendung der Funktion row_number () und der Klausel OVER, die in einem anderen Beitrag vorgestellt wurde ("SELECT row_number () OVER (ORDER BY ...)"). An einigen großen Tischen bemerkte ich manchmal eine Verschlechterung der Leistung.
2 - die Technik mit einem scrollbaren Cursor. Die Implementierung hängt von der verwendeten Sprache ab. Diese Technik scheint auf großen Tischen robuster zu sein.
Ich habe die beiden in PHP implementierten Techniken während eines Seminars im nächsten Jahr vorgestellt. Die Folie ist unter folgendem Link verfügbar: http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf
Entschuldigung, aber dieses Dokument ist nur in Französisch.
quelle
Theres diese verfügbaren Optionen: -
quelle