AGB  ·  Datenschutz  ·  Impressum  







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

Left Join macht Probleme

Ein Thema von Jens Schumann · begonnen am 13. Mär 2005 · letzter Beitrag vom 17. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#1

Left Join macht Probleme

  Alt 13. Mär 2005, 17:54
Datenbank: Firebird 1.5 • Version: 1.5.2.4371 • Zugriff über: IBOConsole , IBX
Hallo,
ich habe ein Problem mit einem Left Join. Es ist mir unerklärlich.
Ich arbeite unter P4 HT, 3GHz, 1GByte Arbeitsspeicher.

tab_1 hat ca 250.000 Datensätze
tab_2 hat ca. 4.000 Datensätze
Da es sich um relative wenig Datensätze handelt ist das Ganze noch mysteriöser

Diese Query wird einwandfrei ausgeführt. Dauer ca 30 Sekunden.
SQL-Code:
SELECT tab_1.JAHR, tab_1.KENNER, tab_1.ENTITY, tab_1.SORTER,
           tab_1.DIVISION, tab_1.PARTNER, tab_1.BWA,
           tab_1.POSNR, tab_2.BEZ
FROM tab_1 INNER JOIN tab_2 ON (tab_1.posnr=tab_2.gvkonto) and (tab_1.kenner=tab_2.kenner)
ORDER BY tab_1.JAHR, tab_1.KENNER, tab_1.ENTITY, tab_1.SORTER
Access 2003 schafft die Abfrage in ca 15 Sekunden

Wenn ich aus dem Join eine Left Join mache stürzt der Firebird scheinbar ab.
Ob die Query mit der IBOConsole oder über IBX abschicke ist egal.
(Sollte hier auch egal sein)
SQL-Code:
SELECT tab_1.JAHR, tab_1.KENNER, tab_1.ENTITY, tab_1.SORTER,
           tab_1.DIVISION, tab_1.PARTNER, tab_1.BWA,
           tab_1.POSNR, tab_2.BEZ
FROM tab_1 LEFT JOIN tab_2 ON (tab_1.posnr=tab_2.gvkonto) and (tab_1.kenner=tab_2.kenner)
ORDER BY tab_1.JAHR, tab_1.KENNER, tab_1.ENTITY, tab_1.SORTER
Access 2003 schafft die Abfrage in ca 15 Sekunden

Um der Sache auf den Grund zu gehen habe ich eine neue Datenbank registriert und dort zwei Tabllen
angelegt. TabelleA hat 11 und TabelleB hat 3 Datensätze. Damit funktioniert der Left Join
SQL-Code:
SELECT tabellea.id,tabellea.feld1,tabelleb.feld1 as Name
FROM tabellea LEFT JOIN tabelleb ON tabellea.feld1=tabelleb.feld1
 ORDER BY tabellea.feld1, tabellea.id
Hat schon jemand gehört, dass der Firebird Probleme mit einem Left Join hat?
[EDIT] Ob ich LEFT JOIN oder LEFT OUTER JOIN schreibe macht keinen Unterschied[/EDIT]
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: Left Join macht Probleme

  Alt 13. Mär 2005, 18:44
Zitat von Jens Schumann:
Hat schon jemand gehört, dass der Firebird Probleme mit einem Left Join hat?
[EDIT] Ob ich LEFT JOIN oder LEFT OUTER JOIN schreibe macht keinen Unterschied[/EDIT]
Jupp, hatte ich.
Das Problem ist wohl, dass der rudimentäre Optimizer von FB oder IB keine nested loops kennt und sortierte Indizes nicht mit in den Query plan berücksichtigt.
Beispiel:
Du vergleichst X.A mit Y.B und auf beiden liegt ein sortierter Index. Die Datenbank hätte somit sehr einfach die Möglichkeit sämtliche Wertekombinationen nur einmal vergleichen zu müssen (wofür liegen die Indizes wohl sonst sortiert vor? ), Firebird interessiert das nicht die Bohne. Der wird sich fleißig einen Wolf rödeln und immer alles mit jedem vergleichen...

Besonders krass zeigt sich der Mangel bei sowas:
SQL-Code:
SELECT X
FROM Y
WHERE Z in (SELECT A
             FROM B
             WHRE C = :C)
Firebird wird die sub query FÜR JEDEN DATENSATZ ausführen. Ich kenne kein anderes ernsthaftes DBMS, dass sich sowas erlaubt.
  Mit Zitat antworten Zitat
Hansa

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

Re: Left Join macht Probleme

  Alt 13. Mär 2005, 18:45
Wenn es mit sehr wenigen Datensätzen geht und mit sehr vielen nicht, dann liegt die Vermutung nahe, daß es an den Daten selbst liegt. Zuerst einmal würde ich die Felder nicht einzeln angeben, sondern vorerst den * verwenden. Würde mich nicht wundern, wenn es dann geht. 8)

@RG: an Firebird wird das kaum liegen. Interessant wäre auch mal die genaue Fehlermeldung.
Gruß
Hansa
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

Re: Left Join macht Probleme

  Alt 13. Mär 2005, 20:07
Zitat von Hansa:
Wenn es mit sehr wenigen Datensätzen geht und mit sehr vielen nicht, dann liegt die Vermutung nahe, daß es an den Daten selbst liegt.
Quatsch!
Irgendwann wird er sich rekursiv so tief im Stack vergraben haben, dass er anfangen muss nur noch kleinere chunks zu bearbeiten.
Da er diese dann ständig wieder vorkramen muss um sie mit den Ergebnissen eines anderen zu vergleichen wird es ab einer bestimmten Anzahl von Datensätzen nunmal langsam.

Zitat von Hansa:
Zuerst einmal würde ich die Felder nicht einzeln angeben, sondern vorerst den * verwenden. Würde mich nicht wundern, wenn es dann geht. 8)
Zitat von Hansa:
@RG: an Firebird wird das kaum liegen. Interessant wäre auch mal die genaue Fehlermeldung.
Die beiden Aussagen beißen sich irgendwie. Schließlich wirfst du Firebird erst vor, dass er zu blöd wäre eine normale SELECT Clause abzufragen um danach zu behaupten, dass es nicht an FB liegen kann.
Beides klingt nach Kaffeesatzlesen und nicht nach einer Aussage von jemandem, der sich mit der Arbeitsweise seiner Datenbank auseinandergesetzt hat.

@Jens, bei FB kannst du ziemlich viel Leistung gewinnen, wenn du dir deine performancekritischsten Tabellen zusammensuchst und ihre Größe pro Datensatz bestimmst.
Danach stellst du dann die Pagesize ein. Somit wird sich FB die Daten in mundgerechten Häppchen von der Platten holen können.
  Mit Zitat antworten Zitat
Hansa

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

Re: Left Join macht Probleme

  Alt 13. Mär 2005, 20:37
Jetzt aber mal halb lang ! Für mich ist Kaffeesatzlesen, irgendwelche Vermutungen anzustellen, ohne die Fehlermeldung zu kennen. 8) Die soll er mal angeben. Ich fange jedenfalls nicht an, vorher über Datenbank Eingeweide rumzulabern und den Fehler da zu suchen und noch zu meckern.

Wie oft wird nach Bugs gefragt, bei denen sich kurze Zeit später herausstellt, daß es ein eigener Programmier-Fehler war ? Ich behaupte in 99,9 % der Fälle (zumindest was Delphi betrifft). Meistens wird das allerdings im Nachhinein nicht zugegeben. Firebird ist zudem sehr stabil.

Wenn irgendwo ein Bug liegt, dann eventuell bei den Zugriffskomponenten. Da Jens FB 1.5 benutzt sind die IBX sehr verdächtig. Mit FB 1.5 würde ich die nicht mehr verwenden.

Völliger Firlefanz ist das Rumschrauben an der Page Size. Die spielt eine untergeordnete Rolle und ist nur intern für die DB relevant. Es ist normalerweise unmöglich, daß eine falsche Größe ein Programm abstürzen läßt.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Left Join macht Probleme

  Alt 14. Mär 2005, 07:11
Hallo Hansa,
es kommt keine Fehlermeldung. Der Firebird hört einfach nicht auf die Query zu bearbeiten. Nach dem die Abfrage 3 Stunden lief habe ich die IBOConsole abgewürgt.
D.h. es passiert scheinbar nichts.

Ich glaube nicht das es an IBX liegt. Bislang habe ich nur gute Erfahrungen im Zusammenspiel IBX und Firebird gemacht. In diesem Fall schickt IBX o. die IBOConsole ja nur die Query zum Server. Die eigentliche Arbeit macht doch der Firebird.

Beide Tabellen haben keinen Index.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Hansa

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

Re: Left Join macht Probleme

  Alt 14. Mär 2005, 08:41
* getestet ? Was sagt der SQL-Monitor ?
Gruß
Hansa
  Mit Zitat antworten Zitat
imp

Registriert seit: 5. Mai 2003
25 Beiträge
 
#8

Re: Left Join macht Probleme

  Alt 14. Mär 2005, 08:52
Hallo,

da ein LEFT JOIN anscheinend ausreichend ist:

Wie verhält sich die Laufzeit wenn du den LEFT JOIN folgender Massen notierst?

Delphi-Quellcode:
SELECT tab_1.JAHR, tab_1.KENNER, tab_1.ENTITY, tab_1.SORTER,
           tab_1.DIVISION, tab_1.PARTNER, tab_1.BWA,
           tab_1.POSNR,
           (SELECT tab_2.BEZ FROM tab_2 WHERE (tab_1.posnr=tab_2.gvkonto) and (tab_1.kenner=tab_2.kenner)) AS BEZ
FROM tab_1
ORDER BY tab_1.JAHR, tab_1.KENNER, tab_1.ENTITY, tab_1.SORTER
Ich hatte auch mal das Problem, das Aggregationen mittels LEFT JOIN total langsam liefen. Mit obiger Schreibweise klappte es hingegen einwandfrei.

Gruss,
Frank
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: Left Join macht Probleme

  Alt 14. Mär 2005, 09:09
Zitat von Robert_G:
Ich kenne kein anderes ernsthaftes DBMS, dass sich sowas erlaubt.
Ist es bei Oracle nicht auch so, dass wenn 2 Tabellen miteinander gejoint werden und die eine im Verhältnis zu der anderen wenig Datensätze (z.B. 250000 zu 4000) enthält, auf die "kleine" Tabelle mit einem full table scan zugegriffen wird, egal, ob da ein Index drauf liegt oder nicht??? Ok, Oracle braucht für die Abfrage oben auch nicht lang, das stimmt.

P.S. Und such nicht immer alle Fehler in Firebird!!! Wir wissen inzwischen, dass du es nicht leiden kannst!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#10

Re: Left Join macht Probleme

  Alt 14. Mär 2005, 09:49
Zitat von Stevie:
P.S. Und such nicht immer alle Fehler in Firebird!!! Wir wissen inzwischen, dass du es nicht leiden kannst!
Mache ich nicht, zum Beispiel bastel ich mir gerade ein Tool, dass mir selbst etwa Arbeit abnehmen soll. Da ich dafür auf keinen DB Server angewiesen sein will nehme ich FB embedded.
FB hat aber nunmal seine Macken, die werden IMHO nur zu gerne vernachlässigt bzw. die User wissen noch nichtmal, dass sie existieren.
Das was da oben steht IST ganz einfach eine solche Macke.
Wenn ich mal etwas krass klinge, dann liegt das oft daran, dass ich oft nicht kapieren kann, warum man auf Gedeih und Verderben FB einsetzen will. Obwohl Konkurrenz DBs á la pgSQL den Job besser und einfacher erledigen würden.

@OT
Zum full Table scan in Ora:
Abfrage
SQL-Code:
SELECT A, B
FROM X, Y
WHERE X.A = Y.ID and
       not B between Y.LowerBound and Y.UpperBound and
       C is null
X hat etwa 10.000 Einträge.

A, B & C sind indiziert. A ist ein FK auf eine Tabelle mit 100 Einträgen (Y). B ist ein Messwert, enthält etwa 2000 unterschiedliche Werte.
C ist eine Beschreibung, die ein mögliches Ausreißen vom Normbereich des Wertes erklärt...

Wenn du das jetzt abfragst wird Oras Optimizer über B & C stolpern. Ein reiner Index read wäre bei den Spalten totaler Blödsinn, da die Verknüpfung der Indizes mit den wirklichen Daten zu aufwendig wäre.
Der Vergleich von A wird aber über den Index gelöst. Denn so kann er sehr schnell die Möglichkeiten reduzieren.
Es ist also kein richtiger FTS, auch wenn er als solcher in der plan table auftaucht.
  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 11:41 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