sagen dass ich habe einige SELECT
Aussage:Suche Zeilennummer in einer Art auf Zeilen-ID basiert, dann seine Nachbarn
SELECT id, name FROM people
ORDER BY name ASC;
Ich habe ein paar Millionen Zeilen in der people
Tabelle und die ORDER BY
Klausel kann viel sein komplexer als das, was ich hier gezeigt habe (möglicherweise auf einem Dutzend Spalten).
Ich erhalte nur eine kleine Teilmenge der Zeilen (sagen Zeilen 1..11), um sie in der Benutzeroberfläche anzuzeigen. Jetzt möchte ich folgende Probleme lösen:
- Finden Sie die Nummer einer Zeile mit einem gegebenen
id
. - Zeigen Sie die 5 Artikel vor und die 5 Artikel nach einer Zeile mit einem gegebenen
id
an.
Problem 2 ist leicht zu lösen, wenn ich das Problem 1 gelöst habe, als ich dann so etwas wie diese verwenden kann, wenn ich weiß, dass der Artikel, den ich suchte Zeilennummer 1000
im sortierten Ergebnismenge hat (dies ist die Firebird SQL-Dialekt):
SELECT id, name FROM people
ORDER BY name ASC
ROWS 995 TO 1005;
ich weiß auch, dass ich die rank einer Reihe von alle Zeilen zu zählen, die vor dem man kommen finden die ich suche, aber dies zu sehr langen WHERE
Klauseln führen kann Tonnen von OR
und AND
in dem Zustand. Und ich muss das wiederholt tun. Bei meinen Testdaten dauert dies Hunderte von Millisekunden, selbst wenn richtig indizierte Spalten verwendet werden, was viel zu langsam ist.
Gibt es eine Möglichkeit, dies zu erreichen, indem Sie einige Funktionen von SQL: 2003 verwenden (wie row_number
in Firebird 3.0 unterstützt)? Ich bin auf keinen Fall ein SQL-Guru und ich brauche hier ein paar Hinweise. Könnte ich eine zwischengespeicherte Ansicht erstellen, in der das Ergebnis einen rank/dichten Rang/Zeilenindex enthalten würde?
zu schwer zu beantworten ohne Info über UI-Typ. Netz? Desktop? Befehlszeile? Voice UI ;-) – rstrelba
Ich zeige eine Liste von Personen in einer Desktop-Anwendung; Da die Sammlung riesig ist, hole ich nur die Zeilen für die Personen, die in das Ansichtsfenster der Liste passen. Der Benutzer hat eine Bildlaufleiste, die es ihr erlaubt, sich an einen beliebigen Punkt in der Liste zu bewegen und ihren Inhalt so zu aktualisieren, als wäre er wirklich mit Millionen von Zeilen gefüllt. –
Wie viele zusätzliche Parameter im Filter des Ansichtsfensters? – rstrelba