Seite 1 von 1

Schlechte QT3 SQL Datenbankperformance

Verfasst: 4. Oktober 2006 15:10
von bp2006
Folgendes Problem:
Wir benutzen das QT3.3.3 Framework um auf einen MS SQL Server zuzugreifen. Auf den Server greifen wir über das Internet zu und sind an sich begeistert von der relativ einfachen High-LvL-API von QT und da wir auch unsere UI mit QT realisieren, fiel die Wahl für uns relativ einfach.

Jedoch stehen wir vor dem Problem, dass die Anfrageauswertung über QT-Cursor oder auch QT-Queries relativ unperformant ist. Für eine simple SQL Anfrage, welche 1800 Records zurückliefert, benötigt er etwas mehr als eine Minute, was absolut unbefriedigend ist.
Bei der gleichen Anfrage auf eine lokale Kopie der DB benötigt das Programm lediglich wenige Millisekunden. Dementsprechend kann man davon ausgehen, dass die Differenz der Auswertungszeit durch den Overhead der Datenpakete über das Internet zustande kommt.
Wir verstehen die Arbeitsweise von QT-Cursor und QT-Queries wie folgt:

1. Man initialisiert die Query mit dem Querystatement
2. Man iteriert über die Query bzw. Cursor Elemente mit Query.next() und geht somit Zeile für Zeile durch das Ergebnis um es weiterzuverarbeiten
3. wiederhole Schritt 2 bis alle Elemente der Query abgearbeitet sind

Nun stellt sich die Frage, ob er für jedes Query.next() jeweils wieder eine Anfrage an die Datenbank stellt und ob man das verhindern kann, da dies relativ viel Zeit in Anspruch nimmt und für unsere Zwecke nicht geeignet ist.

Gibt es also eine Möglichkeit, das komplette Anfrageergebnis lokal auf dem Rechner zu speichern und dann auf diesem lokalen Cursor bzw. Query zu iterieren um die Daten auszulesen, oder gibt es direkt Optionen beim SQL-Treiber (ODBC), mit dessen Hilfe er mehr als ein Ergebnis auf einmal überträgt (cached) um halt den Datenoverhead zu minimieren ?

Wenn jemand von Euch ähnliche Performanceprobleme mit dem QT SQL Framework erlebt hat und vielleicht eine Lösung gefunden hat, würden wir uns über eine Antwort freuen.

Verfasst: 4. Oktober 2006 15:16
von FlorianBecker
Hallo,

also mit MySQL und SQLite3 hatte ich diese Probleme nie, aber mit MS SQL öfters.

Benutzt ihr denn momentan das ODBC Plugin? Wieso nehme ihr nicht das Plugin für MS SQL? Damit würde das bestimmt schon ein bisschen besser klappen. Aber im großen und ganzen war ich mit der MS SQL Datenbank immer schon unzufrieden.

Verfasst: 4. Oktober 2006 15:22
von bp2006
Hey,

danke erstma für die Antwort.

Wir nutzen hier Qt Educational. Ergo gibt es nur ODBC und SQLite als Treiber zur Auswahl - allerdings haben wir bei der Installation auch unter den ausgegrauten keinen für MS SQL gesehen (der dann ja bei der Commercial Edition dabei sein müsste?!).

Oder gibt es den noch an anderer Stelle?


Kannst du vielleicht andere Bibliotheken für den Zugriff auf MS SQL Datenbanken für C++ empfehlen? Die Ergebnisse unserer Google-Bemühungen waren da eher mau...

Verfasst: 4. Oktober 2006 15:26
von FlorianBecker
Also du könntest sonst nur mit der direkten Windows API arbeiten.

Mh, das Plugin heißt QTDS for Sybase Adaptive Server.

Verfasst: 4. Oktober 2006 15:36
von bp2006
Hey,

so wie es aussieht gibbs QTDS erst für Qt4 und nützt und damit leider auch nix.

Direkt die Windows API zu verwenden ist auch nicht gerade das, was uns vorschwebt. Wir wollten uns ja gerade diese Entwicklungsarbeit sparen...

Schade eigentlich, müssen wir auf NHibernate o.ä. ausweichen :twisted:

Verfasst: 4. Oktober 2006 15:38
von FlorianBecker
Hi,

nein, QTDS ist auch in Qt3. Zumindest in der Commercial.