Große Performance-Probleme nach Tausch von Grid
-
Hallo!
Nach dem ich auf meine beiden letzten Einträge keinerlei Antwort erhalten habe, erhoffe ich mir bei diesem Thread mehr Erfolg. Ich habe in meinem aktuellen Projekt ein 'CRDBGrid' durch ein 'TDBAdvGrid' ersetzt. Das sieht ganz schick aus, allerdings habe ich nun große Probleme mit der Performance, will heißen ein Scrollen ist fast nicht mehr möglich. Die Option 'PageMode' habe ich bereits aktiviert. Das hat leider nichts gebracht. Auch ein nachträglich indexieren verschiedener Tabellen hat nicht zum Erfolg geführt. Hervorgerufen wird die schlechte Performance durch nachfolgende Routine:
void __fastcall Tdatenbankkomponenten::D_kundenverwaltungDataChange (TObject *Sender, TField *Field) { // Nur Filtern falls Tabelle 'kundenverwaltung' nicht bearbeitet wird if (Q_kundenverwaltung->State == 1) { // Nur Filtern falls Datensaetze in 'kundenliste' vorhanden sind if (Q_kundenverwaltung->RecordCount > 0) { // Ansicht fuer zugeordnete Automaten aktualisieren Q_automatenverwaltung->SQL->Clear(); Q_automatenverwaltung->SQL->Add ("SELECT * FROM automatenverwaltung"); Q_automatenverwaltung->SQL->Add(" WHERE KUNDENNUMMER = '" + IntToStr(iKundenverwaltungKundennummer) + "' OR VORGEMERKT_KUNDENNUMMER = '" + IntToStr(iKundenverwaltungKundennummer) + "' ORDER BY TYP ASC, BEZEICHNUNG ASC"); Q_automatenverwaltung->Open(); } }
Die Datenbank basiert übrigens auf MySQL Server 5.5, Engine ist InnoDB. Auch mit MyISAM ist es nicht schneller.
Auch ein kurzfristiges verstecken des Grid führt nicht zum Erfolg. Leider bin ich gezwungen diese Abfrage nach jedem 'OnChange' auszuführen, da auch verschiedene Parameter übergeben werden.
Hat jemand eine Idee für einen eleganteren Weg?
Ich freu mich über jeden Lösungsansatz.
Viele Grüße
Maik
-
Ich würde erstmal - auch nur zwecks der Übersicht - die Query zusammenfassen:
UnicodeString qSQL = "SELECT * FROM automatenverwaltung WHERE KUNDENNUMMER = '%i' OR VORGEMERKT_KUNDENNUMMER = '%i' ORDER BY TYP ASC, BEZEICHNUNG ASC", iKundenverwaltungKundennummer, iKundenverwaltungKundennummer );
??? KUNDENNUMMER = iKundenverwaltungKundennummer ???
??? VORGEMERKT_KUNDENNUMMER = iKundenverwaltungKundennummer ???
Copy & Paste oder Tippfehler oder beabsichtigt oder ...?und des weireren kann fehlende Performance natürlich auch an zu grossen Tabellen liegen, oder falschen / fehlenden Indices, ...
grüssle
-
Hallo!
Danke für deine Antwort. Ist so gewollt
Also zu große Tabellen können ausgeschlossen werden, sind vielleicht 150 Datensätze drin. Wie gesagt, mit dem alten Grid hat das problemlos funktioniert.
Ich habe die Tabellen nachträglich indexiert und mit 'Explain Select....' auch geprüft ob die Indexfelder überhaupt angesprochen werden, scheint aber zu passen.
Noch jemand ne Idee?
Viele Grüße
Maik
-
Auf der Seite von TMS unter FAQ
http://www.tmssoftware.com/site/dbadvgrd.asp?s=faq
steht unter "Slow loading date into TDBAdvGrid" ein Tip.
-
Danke für deine Antwort. Das habe ich auch schon gesehen. Allerdings hab ich nicht verstanden ob sich das auf die Query bezieht oder ob ich dafür eine zusätzliche Query brauche. Ich weiß auch nicht welches Datenfeld da ausgelesen wird?
Viele Grüsse, Maik
-
Ich würde ein extra Query nehmen um die Anzahl rauszufinden.
Es wird kein Feld rausgelesen mit COUNT(*) es wird nur die Anzahl der anzuzeigenden Datensätze herausgefunden.
Aber du schreibst es sollen nur um die 150 Datensätze sein da kann ich mir nicht vorstellen das es zu einen Geschwindigkeitsboost kommen kann.Wenn nun wirklich deine Abfrage bzw. der Folgeratenschwanz zu den Problemen führt evtl bringt es ja was das Query nur neu zu öffnen wenn auch die Kundennummer anders ist so ala
if (iOldKundenverwaltungKundennummer!=iKundenverwaltungKundennummer) { Q_automatenverwaltung->SQL->Clear(); Q_automatenverwaltung->SQL->Add ("SELECT * FROM automatenverwaltung"); Q_automatenverwaltung->SQL->Add(" WHERE KUNDENNUMMER = '" + IntToStr(iKundenverwaltungKundennummer) + "' OR VORGEMERKT_KUNDENNUMMER = '" + IntToStr(iKundenverwaltungKundennummer) + "' ORDER BY TYP ASC, BEZEICHNUNG ASC"); Q_automatenverwaltung->Open(); iOldKundenverwaltungKundennummer=iKundenverwaltungKundennummer; }
an der