Einzelnen Beitrag anzeigen

arnof

Registriert seit: 25. Apr 2013
1.250 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: SQL Update-Befehl viel zu langsam

  Alt 24. Dez 2013, 09:51
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
Vorweg ich bin Interbase Laie, habe ich noch nie benutzt, aber folgendes generelles:

Um dein Problem zu finden musst Du einfach mal die Zeiten Stoppen und Dir ausgeben lassen, ich würde behaupten, der Update sollte zwischen allen Programmen und der gleichen Datenbank gleich schnell sein (den mach ja die Datenbank selbst).

Das Problem wird dein Refresh machen:


Delphi-Quellcode:
Procedure TDatBankEdit.Vst_MarkToggle;
var t1,t2,t3,t4,t5:TTime;
begin
  t1:=now;
  DatMod.Dsrc_Berufe.Enabled := False;
  DatMod.SQLMain.SQL.Text := 'update BERUFE set MARKIERT = iif((MARKIERT = 0),1,0)';
  t2:=now;
  DatMod.SQLMain.Execute;
  t3:=now;
  DatMod.Qset_Berufe.Refresh;
  t4:=now;

  Memo1.Lines.Text:='Zeit 1 :'+TimeToStr(t2-t1);
  Memo1.Lines.Add('Zeit 2 :'+TimeToStr(t3-t1));
  Memo1.Lines.Add('Zeit 3 :'+TimeToStr(t4-t1));
  
end;
In diesem Sinne, ich hoffe es hilft und Frohe Weihnachten!
  Mit Zitat antworten Zitat