Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#1

SQL Update-Befehl viel zu langsam

  Alt 24. Dez 2013, 01:43
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDac
Moin allerseits,

in einer Firebird-Tabelle befinden sich rund 24.000 Einträge, die ich in einem VirtualTreeview anzeige. Die Tabellen-Spalte MARKIERT nimmt einen Boolean-Wert auf, der den Checkbox-Status repräsentiert. Wenn ich nun im VirtualTreeView alle Einträge markieren möchte (= in allen Checkboxen den Haken setzen), verwende ich diesen SQL-Befehl via SQL-Komponente:
Delphi-Quellcode:
Procedure TDatBankEdit.Vst_MarkAll;
begin
  DatMod.Dsrc_Berufe.Enabled := False;
  DatMod.SQLMain.SQL.Text := 'update BERUFE set MARKIERT = 1';
  DatMod.SQLMain.Execute;
  DatMod.Qset_Berufe.Refresh;
end;
Danach wird VirtualTree neu eingelesen. Das Problem: Wenn ich diesen SQL-Befehl im DB-Manager (IBExpert) eingebe, dauert die Ausführung incl. Commit und Refresh der Anzeige ca. 5 Sekunden. Mache ich das via Delphi, dann vergehen zwischen 17 und 21 Sekunden, wobei das Anzeigen im TreeView weniger als 1 Sekunde benötigt. Seltsamerweise geht das bedingte Update (Toggle) des Feldes ein wenig schneller: zwischen 13 und 16 Sekunden:
Delphi-Quellcode:
Procedure TDatBankEdit.Vst_MarkToggle;
begin
  DatMod.Dsrc_Berufe.Enabled := False;
  DatMod.SQLMain.SQL.Text := 'update BERUFE set MARKIERT = iif((MARKIERT = 0),1,0)';
  DatMod.SQLMain.Execute;
  DatMod.Qset_Berufe.Refresh;
end;
In IBExpert dauert das dagegen auch nur ca. 5 Sekunden. Was kann ich tun, damit ich annähernd die Geschwindigkeit erreiche, die IBExpert drauf hat?

Bevor sich jemand wundert: Der Checkbox-Status wird natürlich deshalb in der DB gespeichert, damit der Anwender das beim nächsten Start wieder zur Verfügung hat. Beim Ändern einzelner Checkboxen im VirtualTree wird natürlich nur der entsprechende Eintrag in der DB aktualisiert und nicht jedesmal alles. Es gibt aber Buttons bzw. Menüeinträge, mit denen man alle, keine oder invertiert markieren kann. Die Markierungen dienen der späteren Auswahl beim Drucken, Exportieren usw.

Crosspost im Delphi-Treff
  Mit Zitat antworten Zitat