![]() |
Datenbank: Interbase • Version: 6.01 • Zugriff über: IBX
Langsamer Left Outer Join
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 ?
Delphi-Quellcode:
Kann man hier etwas verbessen ?
Left Ouer Join Tabelle1 on (Tabelle2.ID = Tabelle1.ID1 or Tabelle2.ID = Tabelle1.ID2)
Die Verknüpfung kann zur ID1 oder ID2 der Tabelle 2 hergestellt sein. Tanja |
Re: Langsamer Left Outer Join
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. |
Re: Langsamer Left Outer Join
Wie sehen die Idices aus?
Die Bedingung sollte eher
SQL-Code:
heißén.
Tabelle1.ID = 1Tabelle2.ID or Tabelle1.ID2 = Tabelle2.ID
|
Re: Langsamer Left Outer Join
Zitat:
Tanja |
Re: Langsamer Left Outer Join
Zitat:
Tanja |
Re: Langsamer Left Outer Join
Und besitzt dir Tabelle1 jeweils ein Index auf ID1 und ID2?
[Edit: Zitat:
] |
Re: Langsamer Left Outer Join
Hallo!
Zitat:
Zitat:
Zitat:
Zitat:
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. |
Re: Langsamer Left Outer Join
Hallo,
mehrere Sachen fallen mir ein. 1. zu viele Spaltenb im select select * ist falsch 2. das OR durch ne union ersetzen
SQL-Code:
Vielleicht reicht jetzt nen normaler join ?
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) 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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