Tom: Mssql funzt nicht mit Limit

Beitrag lesen

Hello,

Jau, das LIMIT nicht geht hatte ich ja geschrieben. In einigen Foren wird darueber gesprochen, das mann das mit data_seek machen kann, ich weiss nur nicht wie. Irgendwie , soll man eine Schleife machen und mit data_seek auf die Datensaetze springen. Ja aber wie.

Es gibt da prinzipiell zwei Vorgehensweisen:

Man holt bei jedem Zugriff alle Sätze bzw. deren IDs ab, die einem Filterkriterium entsprechen. Also
Snapshot-Verfahren:
-------------------

select ID_adresse from adresse where plz like '28%' and betrag > 0;

Ergibt die Liste der IDs aus der Adressdatei, sagen wir mal 112 Adressen. Die IDs werden in einer Session zwischengespeichert. Nun kannst Du ja Seite für Seite aufbauen, indem Du dann jeweils nochemal soviele Einzelstatements für die gesamten Datensätze absetzt über die ID, wie Du Datensätze auf der Seite anzeigen willst.

Bei kleinen Datensätzen kann man auch die ganzen Datensätze abholen und zwischenspeichern.

Beim Blättern wird dann nur noch im Userspeicher (Session) gearbeitet. Das entlastet die Datenbank und sichert die gesamte Abfrage während des gesamten Vorganges. Sätze, die sich während der Bearbeitung durch andere User verändern, hinzukommen, oder gelöscht wurden werden hier nicht in der Liste aktualisiert (deshalb Snapshot). das Erfahren erfordert daher i.d.R. einen Conflict-Counter, der beim Zurückschreiben der Daten vom DBMS nochmals verglichen wird und automatisch bei jedem Schreibvorgang hochgetzt wird. Stimmt der Counter nicht mehr überein, lehnt das DBMS ein Update oder delete ab.

Dynaset-Verfahren:
-----------------
Nur die in der Seite anzuzeigenden Datensätze werden gelesen. Dafür benötigt man allerdings dann LIMIT oder TOP. Der Aufsetzpunkt, von dem ab gelesen wird, wird jedes Mal neu bestimmt, indem man den letzten gelesen Schlüssel für die gültige Sortierung aus der Tabelle als Argument für den Vergleich nimmt.

select $fields from adresse where plz like '28%' and betrag > 0
    and $schluessel > vergleichsfeld top $anzahl
    order vergleichsfeld,ID_adresse;

Das Verfahren hat einen Haken. Der Index im Vergleichsfeld muss unique sein oder man muss ihn durch Kombination mit einem Primärschlüssel küstlich Promär machen, da man sich bei Duplicates sond Aufhängen könnte, oder Datensätze vergessen könnte. Man kann eine Kombination aus dem Schlüsselfeld und der ID bilden, Das funktioniert meistens. Die Sortierung muss immer über das (Hilfs-)Vergleichsfeld gehen.

Man muss sich zum Vor- und Zurückblättern immer den ersten Vergleichsfeldwert und den letzten merken. Sätze, die durch andere User während der Bearbeitung in den Scope des Filters rücken, werden hier berücksichtigt.

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen