![]() |
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. |
Re: SQL Abfrage schneller machen
Also.. erst mal danke für die vielen Vorschläge...
@Robert_G: Ich hab schon drauf geachtet, dass in start_datum und end_datum die richtigen Werte drin stehen, also genau so, wie sie in der DB gebraucht werden, nämlich in der Art yyyy-mm-dd :angel2: Hab ich extra überprüft - Toll, oder? :zwinker: Ich werd's halt mal mit Join versuchen... Wenn noch jemand ne Idee hat, immer mal her damit! Kenn mich auf dem Gebiet nämlich noch nicht wirklich gut aus :oops: ... Wie funktioniert das mit der View? :wiejetzt: |
Re: SQL Abfrage schneller machen
beispiel:
SQL-Code:
es wird eine Tabelle erzeugt in die man nicht schreiben, aber Sql-abfragen ausführen kann.
CREATE VIEW view_name AS
SELECT * FROM table1,table2 WHERE a=b; So kannst du eine tabelle erzeugen welche genau die Spalten besitzt die du brauchst( auch aus meheren Tabellen) was zu JOIN ![]() |
Re: SQL Abfrage schneller machen
Schau einfach mal in das Sybase Performance and Tuning Guide, da ist genau beschrieben wie Du Deine Abfragen optimieren kannst. Ein erster Ansatz wäre ein Test mit ISQL, wo Du vor Deiner Abfrage folgendes Statement ausführst:
SQL-Code:
Der Sybase Server zeigt Dir dann genau was der Optimizer aus Deiner Abfrage macht.
set showplan on
Gruß, Marcel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 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