AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Langsamer Left Outer Join
Thema durchsuchen
Ansicht
Themen-Optionen

Langsamer Left Outer Join

Ein Thema von Dumpfbacke · begonnen am 29. Jul 2007 · letzter Beitrag vom 30. Jul 2007
Antwort Antwort
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Langsamer Left Outer Join

  Alt 29. Jul 2007, 16:59
Datenbank: Interbase • Version: 6.01 • Zugriff über: IBX
Hallo Leute,
um eine Ergebnis über mehrere Tabellen zu bekommen benutze ich immer Left Outer Join. Es sind natütlich Indexe auf den entsprechenden Feldern vorhanden.

Wenn ich jedoch zwei Bedingungen angebe, so dauert es immer sehr lange. Lann man hier itws machne ?

Left Ouer Join Tabelle1 on (Tabelle2.ID = Tabelle1.ID1 or Tabelle2.ID = Tabelle1.ID2) Kann man hier etwas verbessen ?
Die Verknüpfung kann zur ID1 oder ID2 der Tabelle 2 hergestellt sein.

Tanja
Tanja
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Langsamer Left Outer Join

  Alt 29. Jul 2007, 17:07
Wenn das dein DB-Design ist, dann hast du dort schon ein gravierenden Fehler.
Ein Foreign Key sollte nur auf den Primary Key einer Mastertabelle verweisen, und bestimmt nicht auf entweder Spalte ID1 oder ID2.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Langsamer Left Outer Join

  Alt 29. Jul 2007, 17:08
Wie sehen die Idices aus?
Die Bedingung sollte eher
Tabelle1.ID = 1Tabelle2.ID or Tabelle1.ID2 = Tabelle2.ID heißén.
Markus Kinzler
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Langsamer Left Outer Join

  Alt 29. Jul 2007, 18:07
Zitat von Jelly:
Wenn das dein DB-Design ist, dann hast du dort schon ein gravierenden Fehler.
Ein Foreign Key sollte nur auf den Primary Key einer Mastertabelle verweisen, und bestimmt nicht auf entweder Spalte ID1 oder ID2.
Nein einen Fehler habe ich nicht gemacht. In der Tabelle steht je Zeile eine Datensatz mit zwei Enden und die Enden können auch verdreht sein. Immer drehen kann ich auch nicht, dafür gibt es andere Gründe.

Tanja
Tanja
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Langsamer Left Outer Join

  Alt 29. Jul 2007, 18:09
Zitat von mkinzler:
Wie sehen die Idices aus?
Die Bedingung sollte eher
Tabelle1.ID = 1Tabelle2.ID or Tabelle1.ID2 = Tabelle2.ID heißén.
ID,ID1 und ID2 haben alle einen Index. Gibt es unterschiede was bei dem Vergleich vorne steht ? Das wußte ich auch noch nicht. Werde es gleich mal Test.

Tanja
Tanja
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Langsamer Left Outer Join

  Alt 29. Jul 2007, 18:10
Und besitzt dir Tabelle1 jeweils ein Index auf ID1 und ID2?
[Edit:
Zitat:
Gibt es unterschiede was bei dem Vergleich vorne steht ?
U.U dreht das DBMS die Bedingung bei der Optimierung
]
Markus Kinzler
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#7

Re: Langsamer Left Outer Join

  Alt 29. Jul 2007, 18:16
Hallo!
Zitat von Dumpfbacke:
um eine Ergebnis über mehrere Tabellen zu bekommen benutze ich immer Left Outer Join.
Also, wenn Du wirklich immer mit dem LEFT OUTER JOIN arbeitest, solltest Du Dir dringend die Bedeutung von JOINS angucken

Zitat von Dumpfbacke:
Es sind natütlich Indexe auf den entsprechenden Feldern vorhanden.
Es sind nur Indexe in der RIGHT-Table sinnvoll, die LEFT-Table wird ja sowieso kompßlett durchlaufen

Zitat von Dumpfbacke:
Wenn ich jedoch zwei Bedingungen angebe, so dauert es immer sehr lange.
Das ist ganz klar, für jede der Bedingungen wird die Mastertabelle komplett durchlaufen und versucht, eine Verbindung zur gejointen Tabelle herzustellen

Zitat von Dumpfbacke:
Kann man hier etwas verbessen ?
Bei verwendung des LEFT OUTER JOIN: Nein.
Du solltest überprüfen, ob dieser Join die richtige Wahl ist.
Verrate uns hier doch einmal, was Du erreichen willst, wir helfen Dir gerne weiter.

Merke: Der LEFT OUTER JOIN ist der Performance-Killer schlechthin.

Gruß Thomas

PS: Möchtest Du z.B. alle Datensätze aus TabelleA haben, die eine Entsprechung in TabelleB in FELD2 oder FELD3 haben, so wäre der INNER JOIN das Mittel der Wahl.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
hoika

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

Re: Langsamer Left Outer Join

  Alt 30. Jul 2007, 11:49
Hallo,

mehrere Sachen fallen mir ein.

1. zu viele Spaltenb im select
select * ist falsch

2. das OR durch ne union ersetzen

SQL-Code:
select Tabelle2.bla from Tabelle2
Left Outer Join Tabelle1 on (Tabelle2.ID = Tabelle1.ID1)

union

select Tabelle2.bla from Tabelle2
Left Outer Join Tabelle1 on (Tabelle2.ID = Tabelle1.ID2)
Vielleicht reicht jetzt nen normaler join ?

3. den left outer join vermeiden
3.1 not Exists (kommt auf die Tabellenstruktur an)

3.2 inner join (also normaler join)
einen Dummyrecord eintragen, so das der Join immer ein Ergebnis hat

Bsp: Personal -> Personalgruppe
hat eine Person keine Personalgruppe, wird 0 als FK eingetragen
die Tabelle Personalgruppe hat einen Record mit 0, wo z.B. Name leer ist.


4. Das Ergebnis dirch zusätzliche Where-Bedingungen einschränken
(Index dort drauf)


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


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 19: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