AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Abfrage schneller machen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Abfrage schneller machen

Ein Thema von Klarabella · begonnen am 4. Nov 2004 · letzter Beitrag vom 5. Nov 2004
Antwort Antwort
Seite 1 von 2  1 2      
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#1

SQL Abfrage schneller machen

  Alt 4. Nov 2004, 16:43
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?
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 16:46
Hi Klarabella,

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

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#3

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 16:50
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?
  Mit Zitat antworten Zitat
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#4

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 16:55
Ob das nicht geheim ist?
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
  Mit Zitat antworten Zitat
PRehders

Registriert seit: 31. Okt 2003
Ort: Hamburg
42 Beiträge
 
#5

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 16:55
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
Peter Rehders
Man sollte niemanden ernst nehmen, der sich ernst nimmt.
  Mit Zitat antworten Zitat
der-C

Registriert seit: 29. Okt 2004
68 Beiträge
 
Delphi 6 Professional
 
#6

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 17:03
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
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 17:41
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 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 )
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 18:02
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)
Gruß
Hansa
  Mit Zitat antworten Zitat
Morfio

Registriert seit: 15. Dez 2003
53 Beiträge
 
#9

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 18:17
Uiuiuiiiii, ein Equi-Join. Sieh Dir mal JOIN an (LEFT JOIN, RIGHT JOIN, INNER JOIN, usw.). Damit wird es dann _weitaus_ schneller.

Morfio ...
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#10

Re: SQL Abfrage schneller machen

  Alt 4. Nov 2004, 18:26
@Hansa
Der gleiche Schalumeier wie eh und je
Sowas hier:
'AND ((seriennr.ablaufdatum BETWEEN ''' + start + ''' ...' wird wohl so im String landen:AND ((seriennr.ablaufdatum BETWEEN 03-17-2003... oder so?AND ((seriennr.ablaufdatum BETWEEN 17-03-2003... oder so?AND ((seriennr.ablaufdatum BETWEEN 17.03.03...
Und wie macht der DB-Server eine implizite Umwandlung von String -> Datum?

Ü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? )

@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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:11 Uhr.
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