Von: Jörg Kaschkat
[email protected]
An : Andreas Kosch
Sehr geehrter Herr Kosch!
Bei mir kommt der Interbase-SQL-Server 5.6 auf Linux zum Einsatz.
Die Clients werden unter NT, Solaris und Linux betrieben. Auf NT
werden Abfragen mit der BDE realisiert. Unter Linux und Solaris
wird mit embedded SQL gearbeitet. IB 5.6 hat eine FETCH-Logik, die
nur unidirektional funktioniert. Für Ergebnismengen, die komplett
zwischengespeichert werden können, ist das kein Problem. Auf dem
Server werden riesige Mengen von Messwerten gespeichert. Ergebnis-
mengen von Abfragen können des öfteren mehr als 100000 Zeilen sein.
Mit einem serverseitigen Cursor ist nur eine Vorwärtsbewegung
möglich. In den Handbüchern von Interbase wird für eine Rückwärts-
bewegung in der Ergebnismenge folgender Vorschlag gemacht:
1. Aktuelle Zeilennummer merken.
2. Cursor (Abfrage) schließen.
3. Cursor (Abfrage) neu erzeugen und abschicken.
4. FETCH bis zum gewünschen Bereich ohne Speicherung ausführen.
5. FETCH mit Speicherung ausführen.
Diese Art der Problemlösung funktioniert fehlerfrei, ist jedoch bei
einigen Konstellationen sehr langsam:
Man hat auf dem Client nur einen kleinen Puffer im Programm vorgesehen
und befindet sich relativ nah am Ende der Ergebnismenge. Eine Rückwärts-
bewegung in der Ergebnismenge, die sich auch nicht mehr im programm-
eigenen Puffer befindet, hat extrem viele FETCH-Aufrufe zur Folge, nur
um den Cursor an eine gewünschte Stelle zu positionieren. Auch die
Belastung des Netzes ist sehr hoch.
Meine Frage nun: Gibt es eine Möglichkeit eine Abfrage zu erzeugen und
mit dem Cursor einen "Sprung vorwärts" zu machen, um die vielen FETCH-
Zugriffe zum Positionieren zu vermeiden ?
Mit freundlichem Gruß
J.Kaschkat
[email protected]
An : Andreas Kosch
Sehr geehrter Herr Kosch!
Bei mir kommt der Interbase-SQL-Server 5.6 auf Linux zum Einsatz.
Die Clients werden unter NT, Solaris und Linux betrieben. Auf NT
werden Abfragen mit der BDE realisiert. Unter Linux und Solaris
wird mit embedded SQL gearbeitet. IB 5.6 hat eine FETCH-Logik, die
nur unidirektional funktioniert. Für Ergebnismengen, die komplett
zwischengespeichert werden können, ist das kein Problem. Auf dem
Server werden riesige Mengen von Messwerten gespeichert. Ergebnis-
mengen von Abfragen können des öfteren mehr als 100000 Zeilen sein.
Mit einem serverseitigen Cursor ist nur eine Vorwärtsbewegung
möglich. In den Handbüchern von Interbase wird für eine Rückwärts-
bewegung in der Ergebnismenge folgender Vorschlag gemacht:
1. Aktuelle Zeilennummer merken.
2. Cursor (Abfrage) schließen.
3. Cursor (Abfrage) neu erzeugen und abschicken.
4. FETCH bis zum gewünschen Bereich ohne Speicherung ausführen.
5. FETCH mit Speicherung ausführen.
Diese Art der Problemlösung funktioniert fehlerfrei, ist jedoch bei
einigen Konstellationen sehr langsam:
Man hat auf dem Client nur einen kleinen Puffer im Programm vorgesehen
und befindet sich relativ nah am Ende der Ergebnismenge. Eine Rückwärts-
bewegung in der Ergebnismenge, die sich auch nicht mehr im programm-
eigenen Puffer befindet, hat extrem viele FETCH-Aufrufe zur Folge, nur
um den Cursor an eine gewünschte Stelle zu positionieren. Auch die
Belastung des Netzes ist sehr hoch.
Meine Frage nun: Gibt es eine Möglichkeit eine Abfrage zu erzeugen und
mit dem Cursor einen "Sprung vorwärts" zu machen, um die vielen FETCH-
Zugriffe zum Positionieren zu vermeiden ?
Mit freundlichem Gruß
J.Kaschkat
Comment