Schlechte QT3 SQL Datenbankperformance
Verfasst: 4. Oktober 2006 15:10
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.
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.