![]() |
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? :?: |
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 |
Re: SQL Abfrage schneller machen
Zitat:
Ich nehme mal an, du öffnest das Dataset immer nur einmal, oder? |
Re: SQL Abfrage schneller machen
:gruebel: Ob das nicht geheim ist? :roll: :wink:
Delphi-Quellcode:
Zur Laufzeit kommt noch folgendes hinzu:
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)
Delphi-Quellcode:
wobei start = aktuelles Datum und ende = aktuelles Datum + 3 monate
AND ((seriennr.ablaufdatum BETWEEN ''' + start + ''' ' +
'AND ''' + ende + ''') OR (beleg_position.bf_pov_feld_5 BETWEEN ' + '''' + start + ''' AND ''' + ende + ''')) |
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 |
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 |
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:
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. :)
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; Zitat:
|
Re: SQL Abfrage schneller machen
Zitat:
|
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 ... |
Re: SQL Abfrage schneller machen
@Hansa
Der gleiche Schalumeier wie eh und je ;) Sowas hier:
Delphi-Quellcode:
wird wohl so im String landen:
'AND ((seriennr.ablaufdatum BETWEEN ''' + start + ''' ...'
SQL-Code:
oder so?
AND ((seriennr.ablaufdatum BETWEEN 03-17-2003...
SQL-Code:
oder so?
AND ((seriennr.ablaufdatum BETWEEN 17-03-2003...
SQL-Code:
:shock:
AND ((seriennr.ablaufdatum BETWEEN 17.03.03...
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 23:20 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