Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: zu langsamer select! warum??

  Alt 6. Jul 2005, 07:46
Hallo Kerim,

wenn die Funktion GetSQL dein SQL-Statement zusammenbaut, dann solltest du nicht die einzelnen Teile der SQL-Eigenschaft der Query zuweisen. Die Zuweisung geschieht doch wahrscheinlich an einer ganz anderen Stelle:

Delphi-Quellcode:
procedure TListeBuchungen.CBYearChange();
var
  dt: TDateTime;
begin
  Query.SQL.Text := GetSQL;
  dt := Now;
  Query.Open;
  ShowMessage(TimeToStr(Now - dt));
  ...
end;
Die Funktion GetSQL sollte dann besser so aussehen:

Delphi-Quellcode:
function TListeBuchungen.GetSql: string;
const
  fmt = 'SELECT b.buchunglfdnr, b.lfdnr, b.buchungnr, b.ticketnr, '
      + 'b.adrnr, b.veranstalter, b.hinabflugdatum, b.hinabflugzeit, '
      + 'b.hinabflugort, b.hinankunftort, b.hinflugnr, '
      + 'b.rueckabflugdatum, b.rueckabflugzeit, b.rueckabflugort, '
      + 'b.rueckankunftort, b.rueckflugnr, b.nettopreis, b.anzahlung, '
      + 'b.tax, b.mwst, b.rabatt, b.gewinnprozent, a.name, a.vorname '
      + 'FROM buchungen b, adressen a '
      + 'WHERE EXTRACT(YEAR FROM b.hinabflugdatum) = %d '
      + 'AND b.adrnr = a.adrnr %s '
      + 'ORDER BY %s '
      ;
var
  iJahr: integer;
  s, sFilter, sOrder, sPattern: string;
begin
  with CBYear do
    iJahr := StrToInt(Items[ItemIndex]);

  sFilter := AnsiUppercase(Trim(edit1.Text));
  s := '';
  if sFilter <> 'then begin
    sPattern := QuotedStr('%' + SFilter + '%');
    with query do
      for i := 0 to FieldCount - 1 do
        if Fields[i].DataType = ftString then begin
          if s <> 'then s := s + ' OR';
          s := s + Format(' UPPER(%s) LIKE %s', [LowerCase(Fields[i].FieldName), sPattern]);
        end;
    s := 'AND ( ' + s + ' )';
  end;

  sOrder := 'b.hinabflugdatum'; // hier kommt bestimmt noch mehr Code hin...

  Result := Format(fmt, [iJahr, sWhere, sOrder]);
end;
Die Filterung in jedem Textfeld mit einem Like-Pattern, bei dem vorne und hinten trunkiert wird, kann bei größeren Tabellen irgendwann zum Laufzeitproblem werden. Eventuell wirst du die Suche etwas mehr einschränken müssen.

Der Vergleich der Ausführungszeiten von deinem Programm und IBConsole ist bestimmt nicht korrekt. Grundsätzlich erwarte ich ähnliche Zeiten in deinem Programm. Die kurze Ausführungszeit in IBConsole werte ich als Indiz dafür, dass FireBird mit der Erstellung eines optimierten Zugriffsplanes kein Problem hat.

Grüße vom marabu
  Mit Zitat antworten Zitat