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 2 von 3     12 3      
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#11

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 21:58
Sogar Oracle setzt bei sowas einen Full Table Scan an, wenn das Ergebnis noch in der Art wie oben angegeben verjoint wird. Egal, ob da ein Index sitzt oder nicht. Bei so einem geschachtelten Statement setzt früher oder später jede Ablaufplanoptimierung aus, egal wie gut sie ist.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 22:25
hallo

ich denke es kommt auf die Anzahl der Datensätze an.
du kannst es ja mal mit den ODBC Treiber für Mysql probieren, vielleicht sind die schneller
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
Hoshy

Registriert seit: 27. Apr 2006
32 Beiträge
 
Delphi 7 Architect
 
#13

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 22:50
"OR" Verknüpfungen in Abfragen sind immer schlecht...

Arbeite lieber mir UNION ALL, das dürfte schonmal schneller sein:

SQL-Code:
SELECT kv.*, kr.ID as id_rechnungen, null as id_gutschriften, null as id_lieferscheine
FROM kasse_vorgaenge kv
LEFT JOIN kasse_rechnungen kr ON kv.ID = kr.vorgangsnummer
WHERE kv.kundennummer = 1 AND kv.datum BETWEEN '2006-05-01AND '2006-11-28'

UNION ALL

SELECT kv.*, null as id_rechnungen, kg.ID as id_gutschriften, null as id_lieferscheine
FROM kasse_vorgaenge kv
LEFT JOIN kasse_gutschriften kg ON kv.ID = kg.vorgangsnummer
WHERE kv.kundennummer = 1 AND kv.datum BETWEEN '2006-05-01AND '2006-11-28'

UNION ALL

SELECT kv.*, null as id_rechnungen, null as id_gutschriften, kl.ID as id_lieferscheine
FROM kasse_vorgaenge kv
LEFT JOIN kasse_lieferscheine kl ON kv.ID = kl.vorgangsnummer
WHERE kv.kundennummer = 1 AND kv.datum BETWEEN '2006-05-01AND '2006-11-28'
Leg einen Index über (kv.kundennummer, kv.datum) und jeweils einen über die Vorgangsnummer der anderen Tabellen.

Gruß
Andi
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: SQL-Abfrage dauert zu lange

  Alt 28. Nov 2006, 23:21
Zitat von Phoenix:
Sogar Oracle setzt bei sowas einen Full Table Scan an, wenn das Ergebnis noch in der Art wie oben angegeben verjoint wird. Egal, ob da ein Index sitzt oder nicht. Bei so einem geschachtelten Statement setzt früher oder später jede Ablaufplanoptimierung aus, egal wie gut sie ist.
Nee, das kann nicht sein, dann wäre Oracle ja schlechter als mein Frickel-DBMS. Es gibt kein Konstrukt, bei dem ein Optimizer aussetzt und dann nur einen FTS duchführt. Wenn der Optimizer entscheidet, das ein FTS das Billigste ist, dann nur, weil ein Index nicht zur Verfügung steht, oder die Tabellengröße relativ klein ist.

Phoenix, wie kommst Du darauf, das 'selbst Oracle' einen FTS macht...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hansa

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

Re: SQL-Abfrage dauert zu lange

  Alt 29. Nov 2006, 00:01
Zitat von alzaimar:
...Es gibt kein Konstrukt, bei dem ein Optimizer aussetzt und dann nur einen FTS duchführt...
Wie wärs denn hiermit : select * from table where name like '%test%' ? Erkläre mal wie man das optimieren kann.
Gruß
Hansa
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: SQL-Abfrage dauert zu lange

  Alt 29. Nov 2006, 08:13
Hansa, da 'setzt' der Optimierer nicht aus, sondern macht das Beste draus. Kleiner, feiner Unterschied. Und falls eine Volltextsuche eingeschaltet ist, kann hier auch der dümmste Optimierer optimieren.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#17

Re: SQL-Abfrage dauert zu lange

  Alt 29. Nov 2006, 08:15
Moin Hansa,

das ist einfach: Einen Index auf das Feld legen und aus dem table scan wird ein index scan. Da geht die Post ab - besonders, wenn die index pages auch noch komplett im memory pool des DBMS gehalten werden. Und wenn du das richtige RDBMS verwendest, dann musst du den Index noch nicht mal selbst erzeugen.

Freundliche Grüße
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: SQL-Abfrage dauert zu lange

  Alt 29. Nov 2006, 08:27
Zitat von marabu:
Und wenn du das richtige RDBMS verwendest, dann musst du den Index noch nicht mal selbst erzeugen.
Moin marabu,

Welches RDBMS kann das denn? Welches RDBMS wagt es, meine Indexstrategie zu unterminieren? Her damit!

Grüße.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hansa

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

Re: SQL-Abfrage dauert zu lange

  Alt 29. Nov 2006, 20:11
Zitat von alzaimar:
Welches RDBMS wagt es, meine Indexstrategie zu unterminieren? Her damit!
Wird eine Strategie gebraucht, zusammengesetze Indizes usw. dann wird das wohl nirgends automatisch gehen. Aber das wichtigste müßte die DB schon selber erkennen. Siehe hier :

http://www.ibexpert.info/documentati...dices/419.html

Und das war auch ungefähr das, was ich gemeint hatte. Man könnte ja nun einige Spalten manuell indizieren. Aber die Vorteile werden eben durch Konstrukte wie LIKE %BLUBB% mehr oder weniger zunichte gemacht.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: SQL-Abfrage dauert zu lange

  Alt 29. Nov 2006, 20:46
Zitat von Hansa:
Zitat von alzaimar:
...Es gibt kein Konstrukt, bei dem ein Optimizer aussetzt und dann nur einen FTS duchführt...
Wie wärs denn hiermit : select * from table where name like '%test%' ? Erkläre mal wie man das optimieren kann.
Indem man CONTAINS und FTI einsetzt?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 02:42 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