Dank deiner Erklärung habe ich mir mal das Verhalten vom
SQL-Server genauer angeschaut und mal wieder dazugelernt, wie unterschiedlich
MSSQL und
FB sind (und zwar nur, was den Optimizer anbelangt).
Ich würde bei einem kommerziellen Produkt eines Marktführers auch ganz andere Maßstäbe anlegen, als bei einem kostenlosen OpenSource Produkt. Selbst oder gerade bei guten Optimizern bleibt es dank ihrer Komplexität, mangelnder Kenntnis des Statistik Zustandes und der Grenzwert Gewichtungen im Extremfall immer wieder eine Überraschung, was der Optimizer macht.
..
So sieht nun mein Select Aus
Delphi-Quellcode:
....
From Tebelle1
Left Outer join Tabelle2 on (Tabelle1.BNummer = Tabelle2.BNummer and
Tabelle2.aazaehler = (Select Max(AAZaehler) from Tabelle2 AA where AA.BNummer = Tabelle1.BAnummer and
AA.Kriterium = 'ID' and AA.AAStatus <> 'Erledigt' ))
Where Tabelle1.Feld1 = '4EE' and (Tabelle1.Feld2 = 'Frankfurt' or Tabelle1.Feld2 = 'München'
Ich muss leider der Join so machen auf jeden Fall aus meiner Sicht. Eventuell kann es ja jemand besser und gibt mir einen Tip.
Ich habe in meiner ersten Antwort etwas von Selektivität geschrieben- kannste ja mal nachschlagen. Du kannst versuchen, Dir das hier zu nutze zu machen und dem Optimizer etwas auf die Sprünge zu helfen. Wenn es also tatsächlich 200k Sätze sind- nicht viel, aber auch nicht zu vernachlässigen-, die Dank der Where Bedingung 4EE+Frankfurt|München auf 19 zusammenschmilzen, ist das eine sehr brauchbare Reduktion, mit der ich experimentieren würde.
Z.B.:
Das oben zitierte Statement so umbauen, dass Tabelle1 Select mit Where Bedingung ganz allein in einem inneren Selekt liegt und der Join auf Tabelle2 mit Group By "darüber".
Code:
Select * from (Select * from Tabelle1 where 4EE and Franktfurt|München)
Left Outer join Tabelle2 on (siehe oben)