AGB  ·  Datenschutz  ·  Impressum  







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

SQL-Abfrage dauert zu lange

Ein Thema von davar · begonnen am 28. Nov 2006 · letzter Beitrag vom 6. Dez 2006
Antwort Antwort
Seite 1 von 3  1 23      
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#1

SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 11:44
Datenbank: MySQL • Version: 4.x • Zugriff über: Zeos
Hallo Leute,

bei folgende SQL-Abfrage dreht mein Rechner durch. PHPMyAdmin benötigt für das Ergebnis 7 Sekunden, Delphi mit Zeos kommt sogar auf Minuten.

Hab ich nun einen Denkfehler in die Abfrage eingebaut oder ist das normal?

Folgende Sachen sind gegeben:

Tabellen: kasse_vorgaenge, kasse_rechnungen, kasse_gutschriften, kasse_lieferscheine

In jedem einzelnen Datensatz von "kasse_vorgaenge" steht in der Spalte "vorgangsart", ob es sich um eine Rechnung, Lieferschein oder Gutschrift handelt. Mit

SELECT * FROM kasse_vorgaenge WHERE kundennummer = 1 WHERE datum BETWEEN 2006-05-01 AND 2006-11-28 komme ich ganz normal weiter. Nun möchte ich jedoch auch die jeweilige Rechnungs-, Gutschrifts- bzw. Lieferscheinnummer dabei haben, die in den anderen drei Tabellen stehen.

Also nehme ich folgende Abfrage:

Delphi-Quellcode:
SELECT
   kasse_vorgaenge.*, kasse_rechnungen.ID, kasse_gutschriften.ID, kasse_lieferscheine.ID
FROM
   kasse_vorgaenge, kasse_rechnungen, kasse_gutschriften, kasse_lieferscheine
WHERE
   kasse_vorgaenge.kundennummer = 1
  AND
   kasse_vorgaenge.datum BETWEEN 2006-05-01 AND 2006-11-28
  AND
   kasse_rechnungen.vorgangsnummer = kasse_vorgaenge.ID
  OR
   kasse_gutschriften.vorgangsnummer = kasse_vorgaenge.ID
  OR
   kasse_lieferscheine.vorgangsnummer = kasse_vorgaenge.ID
GROUP BY kasse_vorgaenge.ID
Hat jemand eine Idee, wie ich das Ergebnis schneller bekomme?


MfG

davar
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 11:55
Das ist ein ziemlich komplexes Thema (optimierung von Queries)

Was du zuerst prüfen solltest:
Sind die Indizes (von manchen auch Indexe genannt) korrekt gesetzt.

In deinem Fall bei Tabelle kasse_vorgaenge z.B. auf kundennummer und datum
und in den anderen Tabellen die jeweiligen Vorgangsnummern.

Wenn immer möglich benutze InnerJoin In deinem Fall würde ich Sub-Selects verwenden
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 17:56
Es scheinen auch Klammern zu fehlen.
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 18:29
Hallo,

Outer Join ?
Das hier sind doch auch inner joins, nur halt die alte Syntax.

Ich würde hier entweder 3 Queries machen,
und dass dann am Client zusammenbauen,
oder eine Stored Procedure, die intern ebenfalls auf 3 Queries aufbaut,
(+ der Query für den kasse_vorgangs_id Cursor).


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#5

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 18:45
Durch die BETWEEN - Abfrage wird die Datenbank auf jeden Fall einen Full Table Scan machen. Und das leider zwangsläufig auf allen Tabellen. Und ein FTS ist so ziemlich das Schlimmste was Dir bei der Performance passieren kann.

Versuch mal, die Between-Abfrage rauszulassen und schau, wie das Laufzeitverhaltend es Queries dann ist. Setze zudem noch Indizes auf die abgefragten Spalten.

Die Auswahl nach dem Datum machst Du dann im Client. Das dürfte performanter sein.

Ausnahme: Du setzt vorher einen Index auf das Datum und machst eine materialized View die Dir die Tabelle nach dem Datum eingrenzt. Das Problem wird hier aber sein, dass das Datum ja eher dynamischer Natur ist und damit fällt die View an der Stelle wohl weg.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 19:27
Zitat von Phoenix:
Durch die BETWEEN - Abfrage wird die Datenbank auf jeden Fall einen Full Table Scan machen. Und das leider zwangsläufig auf allen Tabellen. Und ein FTS ist so ziemlich das Schlimmste was Dir bei der Performance passieren kann.

Ein "x BETWEEN a AND b"ist -zumindest bei MSSQL- genau das Gleiche wie "x>=a AND x<=b". Wieso sollte er einen FTS machen? Sofern X indiziert ist, kann der Server doch toll optimieren.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Mumpe

Registriert seit: 22. Nov 2006
12 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 20:09
Kannst Du mal sagen, wie viele Datensätze in den einzelnen Tabellen sind?
Ich tippe auch eher auf die Richtung, die mkinzler ansprach.

Deine Abfrage sucht Dir nebenbei mal alle Datensätze aus "kasse_gutschriften" und "kasse_lieferscheine" deren Vorgangsnummer = kasse_vorgaenge.ID ist.

Dazu kommen dann noch die Datensätze aus kasse_rechnungen die zu den aus kasse_vorgaenge selektierten passen.

Wenn Du die OR-Bedingungen in Klammern setztest, würdest Du eher das Ergebnis bekommen, das Du haben möchtest und wahrscheinlich geht die Abfrage dann auch schneller.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 20:19
Hallo davar,

vielleicht so...

SQL-Code:
SELECT kv.*,
       kr.ID,
       kg.ID,
       kl.ID
FROM kasse_vorgaenge kv
LEFT JOIN kasse_rechnungen kr
  ON kv.ID = kr.vorgangsnummer
LEFT JOIN kasse_gutschriften kg
  ON kv.ID = kg.vorgangsnummer
LEFT JOIN kasse_lieferscheine kl
  ON kv.ID = kl.vorgangsnummer
WHERE kv.kundennummer = 1
  AND kv.datum BETWEEN '2006-05-01AND '2006-11-28'
Gruss
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 21:16
Wie erkennt man denn, dass die Datenbank einen Full Table Scan macht?

Sieht man das im Profiler? Wenn ja woran?
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 21:22
Du musst doch nur einen Index über die Datumsspalte machen, dann macht kein normales DBMS einen 'full table scan'. Oder Ist MySQL etwa kein normales DBMS?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 00:54 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