AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi zu langsamer select! warum??
Thema durchsuchen
Ansicht
Themen-Optionen

zu langsamer select! warum??

Ein Thema von kerim80 · begonnen am 5. Jul 2005 · letzter Beitrag vom 7. Jul 2005
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz