Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Abfrage schneller machen (https://www.delphipraxis.net/33304-sql-abfrage-schneller-machen.html)

Klarabella 4. Nov 2004 15:43


SQL Abfrage schneller machen
 
Habe eine Sybase Datenbank, aus der ich über eine Query Daten heraushole. Diese werden über eine DataSource-Komponente in einem DBGrid eingefügt.
Das Laden aus der Datenbank dauert jedesmal sehr lange...
Die Abfrage ist sehr umfangreich, ich verwende 9 Tabellenfelder aus 5 verschiedenen Tabellen und damit auch 5 "WHERE"-Klauseln.
Eine Änderung der Abfrage ist leider nicht möglich, da genau diese Felder benötigt werden.
Wie kann ich das Ganze etwas schneller machen?
Hat jemand eine Idee? :?:

alcaeus 4. Nov 2004 15:46

Re: SQL Abfrage schneller machen
 
Hi Klarabella,

dazu müsstest du uns schon das Statement verraten. Ohne SQL-Code können wir auch nix optimieren :zwinker:

Greetz
alcaeus

Treffnix 4. Nov 2004 15:50

Re: SQL Abfrage schneller machen
 
Zitat:

Zitat von Klarabella
Eine Änderung der Abfrage ist leider nicht möglich, da genau diese Felder benötigt werden.

Scheinbar soll gar nicht das Statement geändert werden. Allerdings lässt sich da in Delphi wohl leider nicht ganz viel optimieren. Das Nadelöhr ist nunmal die Datenbank. Also wenns was zu optimieren gibt, dann vermutlich am SQL-Statement.

Ich nehme mal an, du öffnest das Dataset immer nur einmal, oder?

Klarabella 4. Nov 2004 15:55

Re: SQL Abfrage schneller machen
 
:gruebel: Ob das nicht geheim ist? :roll: :wink:
Delphi-Quellcode:
SELECT seriennr.ablaufdatum, beleg_position.bf_pov_feld_5, artikel.artikelnr, artikel.bezeichnung1, seriennr.nr, kunde.kl_nr, kunde.bezeichnung, beleg_position.belegnr, beleg_position.belegart FROM seriennr, artikel, kunde, beleg_position, artikel_kunde WHERE (seriennr.artikelnr = artikel.artikelnr) AND (artikel.artikelnr = artikel_kunde.artikelnr) AND (artikel_kunde.kl_nr = kunde.kl_nr) AND (artikel.artikelnr = beleg_position.artikelnr)
Zur Laufzeit kommt noch folgendes hinzu:
Delphi-Quellcode:
 AND ((seriennr.ablaufdatum BETWEEN ''' + start + ''' ' +
    'AND ''' + ende + ''') OR (beleg_position.bf_pov_feld_5 BETWEEN ' +
    '''' + start + ''' AND ''' + ende + '''))
wobei start = aktuelles Datum und ende = aktuelles Datum + 3 monate

PRehders 4. Nov 2004 15:55

Re: SQL Abfrage schneller machen
 
Hallo,

am SQL wirst du dann ja nicht viel ändern können; wie sieht es auf der Datenbankseite aus? Hast Du Indizes auf den JOIN-Feldern bzw. auf den einschränkenden Feldern in den WHERE-Bedingungen? Sonst muss nämlich meistens ein Table-Scan gemacht werden!
Bei einigen DBs hilft es auch schon, wenn du in der FROM-Klausel die kleinsten Tables (also mit den wenigsten Rows) nach vorne schreibst.

Viel Glück

Peter

der-C 4. Nov 2004 16:03

Re: SQL Abfrage schneller machen
 
vieleicht hilft es wenn du erstmal ein View erzeugst und dann darauf die SQL abfrage loslässt
da muss glaube ich nicht ständig die tabelle zusammengesetzt werden

Robert_G 4. Nov 2004 16:41

Re: SQL Abfrage schneller machen
 
moin,
Wird die Abfrage öfter mit diesen zusätzlichen Werten aufgerufen?
Eine kurze Suche zu [dp:616481b3d1=SQL AND Parameter]Parametern[/dp:616481b3d1] dürfte dich da schon ein ganzes Stück vorwärts bringen. ;)
Genrell gilt das man Datumswerte niemlas in einen SQL String reinfriemelt, das geht einfach zu gerne nach hinten los. ;)
Wenn du immer mit den 2 Werten abfragst, dann so:
Delphi-Quellcode:
with DeineQuery do
begin
  SQL.Text :=
    'SELECT seriennr.ablaufdatum' + #10 +
    '     ,beleg_position.bf_pov_feld_5' + #10 +
    '     ,artikel.artikelnr' + #10 +
    '     ,artikel.bezeichnung1' + #10 +
    '     ,seriennr.nr' + #10 +
    '     ,kunde.kl_nr' + #10 +
    '     ,kunde.bezeichnung' + #10 +
    '     ,beleg_position.belegnr' + #10 +
    '     ,beleg_position.belegart' + #10 +
    'FROM  seriennr' + #10 +
    '     ,artikel' + #10 +
    '     ,kunde' + #10 +
    '     ,beleg_position' + #10 +
    '     ,artikel_kunde' + #10 +
    'WHERE (seriennr.artikelnr = artikel.artikelnr) and' + #10 +
    '      (artikel.artikelnr = artikel_kunde.artikelnr) and' + #10 +
    '      (artikel_kunde.kl_nr = kunde.kl_nr) and' + #10 +
    '      (artikel.artikelnr = beleg_position.artikelnr) and' + #10 +
    '      ((seriennr.ablaufdatum between :iStartDT and :iEndDT) or' + #10 +
    '      (beleg_position.bf_pov_feld_5 between :iStartDT and :iEndDT))';
  // Parse Statement um Variablen zu erkennen
  Prepared := True;
  // Parameterzuweisung
  with Parameters do
  begin
    ParamByName('iStartDT').DataType := ftDate;
    ParamByName('iStartDT').Value := DeinStartDatum;
    ParamByName('iEndDT').DataType := ftDate;
    ParamByName('iEndDT').Value := DeinEndDatum;
  end;
  // Ausführen
  Open();
end;
So sparst du deiner armen DB eine Menge Aufwand beim Parsing und mit etwas Glück hat sie die Ergebnisse (oder wenigsten den Queryplan ;) ) bei 2. Mal noch im Cache. :)

Zitat:

Zitat von der-C
vieleicht hilft es wenn du erstmal ein View erzeugst und dann darauf die SQL abfrage loslässt
da muss glaube ich nicht ständig die tabelle zusammengesetzt werden

Vor allem wäre dann der Code nicht mehr so hässlich. (siehe oben :zwinker: )

Hansa 4. Nov 2004 17:02

Re: SQL Abfrage schneller machen
 
Zitat:

Zitat von Robert_G
Genrell gilt das man Datumswerte niemlas in einen SQL String reinfriemelt, das geht einfach zu gerne nach hinten los. ;)

Dann erkläre mal, was Du da meinst. Inwiefern ein Datumswert etwas anderes ist, als ein integer und was nach hinten losgehen soll. 8)

Morfio 4. Nov 2004 17:17

Re: SQL Abfrage schneller machen
 
Uiuiuiiiii, ein Equi-Join. Sieh Dir mal JOIN an (LEFT JOIN, RIGHT JOIN, INNER JOIN, usw.). Damit wird es dann _weitaus_ schneller.

Morfio ...

Robert_G 4. Nov 2004 17:26

Re: SQL Abfrage schneller machen
 
@Hansa
Der gleiche Schalumeier wie eh und je ;)
Sowas hier:
Delphi-Quellcode:
'AND ((seriennr.ablaufdatum BETWEEN ''' + start + ''' ...'
wird wohl so im String landen:
SQL-Code:
AND ((seriennr.ablaufdatum BETWEEN 03-17-2003...
oder so?
SQL-Code:
AND ((seriennr.ablaufdatum BETWEEN 17-03-2003...
oder so?
SQL-Code:
AND ((seriennr.ablaufdatum BETWEEN 17.03.03...
:shock:
Und wie macht der DB-Server eine implizite Umwandlung von String -> Datum? :gruebel:

Übergibst du es als Parameter sparst du dem Server eine implizite Umwandlung (was sich schnell als Handbremse herausstellt ;) ) und die möglichen Fehler. Lasse mal DB Server ein Format á la DD-MM-YY haben, den Client ein MM-DD-YY sang und klanglos wird er Monat und Tag vertauschen (Erst bei einem Tag > 12 wird es knallen, aber bekommst du es auch rechtzeitig mit? :P )

@Morfio, ginge es hier um MS Jet hättest du vollkommen recht. Bei jeder "richtigen" DB (wie Sybase nunmal ist ;) ) macht es absolut keinen Unterschied.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz