Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: FireDAC + Firebird dynamisch optimieren

  Alt 21. Mai 2013, 12:14
Ich habe soeben in meiner unendlichen Weisheit festgestellt, dass es sinnvoll sein kann, vernünftige Indizes zu definieren.

Bei 30T Datensätzen dauert es dennoch einen Moment, "select Count" abzuhandeln.

Ich muss dann halt wohl das Ergebnis zwischenpuffern und nur in bestimmten Fällen neu ermitteln. Wenn ich die Rückgabe per fester Vorgabe regle, dann läuft das ausreichend schnell.

Ich will diese "Optimierungen" letztlich aber meinem Framework und insbesondere meinem Gitter überlassen, so dass sich der Programmierer dann nicht mehr darum kümmern muss.
Gefühlt bindet man einfach die 1Mio Objekte bzw. Datensätze an das Gitter und das Framework beschafft dann die aktuell benötigten (weil gerade sichtbaren) Datensätze. Das funktioniert dann für diverse Listen und Datenmengen gleichermaßen.

Geringe Leistungseinbußen will ich dann zu Gunsten der effektiven Handhabung in Kauf nehmen.
Anbei mal die Count-Funktionen der beiden aktuellen ORM-Varianten (IBX + FireDAC) und die AQTime-Logs. Das muss natürlich jetzt noch gesäubert werden.


Delphi-Quellcode:
function TssOrmAd.ListItemsCount(O: TObject): Integer;
var
  TableName: string;
begin
  // Exit(33901); // Simulation

  if not(O is TssObject) then
    Exit(0);
  if (O as TssObject).SaveMode then
    Exit(0);

  TableName := 'ItemsList';

  AdQuery.SQL.Clear;
  AdQuery.SQL.Add('select Count(*) from ' + TableName);
  AdQuery.SQL.Add('where Owner = :Owner');
  AdQuery.ParamByName('Owner').AsString := (O as TssObject).Id;
  AdQuery.Open;
  Result := AdQuery.FieldByName('Count').AsInteger;
  AdQuery.Close;
end;

...

function TssOrmIbx.ListItemsCount(O: TObject): Integer;
var
  TableName: string;
begin
  // Exit(33901); // Simulation

  if not(O is TssObject) then
    Exit(0);
  if (O as TssObject).SaveMode then
    Exit(0);
  if IBSQL.Open then
    Exit(0);

  TableName := 'ItemsList';

  IBSQL.SQL.Clear;
  IBSQL.SQL.Add('select Count(*) from ' + TableName);
  IBSQL.SQL.Add('where Owner = :Owner');
  IBSQL.ParamByName('Owner').AsString := (O as TssObject).Id;
  IBSQL.ExecQuery;
  Result := IBSQL.FieldByName('Count').AsInteger;
  IBSQL.Close;
end;
Miniaturansicht angehängter Grafiken
aqad.jpg   aqibx.jpg  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat