Rolf B: Entscheidungsschwäche

Beitrag lesen

Hallo Frau Zwurbel,

wirklich ein schönes Essay :)

Ich vermute, dass die Filiale in der Preise-Tabelle steht. Und dass die Korrelation Zwerg/Zwergvariante zu Preis über die Nummer gemacht wird.

Dieser Self-Merge für Zwerge und Varianten ist von der bösen Stiefmutter. Weil - da werden zwei Relationen in eine Tabelle vermengt, und der Self-Merge ist in dieser Form Unsinn. Die IFNULLs treiben dazu noch den Optimizer zum Apfelvergiften.

Korrekt ist eine Tabelle für Grundformen, eine weitere für Varianten, und die kann man mit LEFT JOIN verbinden ohne ein kartesisches Monsterprodukt zu erschaffen. IFNULL ist dann für die Namen auch nicht nötig (na gut, im Self-Join sind die IFNULL genauso überflüssig).

SELECT IFNULL(v.nummer, g.nummer) as nummer
     , g.name
     , v.variante
FROM zwerge g 
     LEFT JOIN zwergoide v ON v.grundform = g.nummer

Für die Angebote einer Filiale stellt sich nun die Frage, wie die Beziehung zwischen Preisen und Varianten/Grundformen ist. Das ist in der Anfrage nicht klar, der ON fehlt. Ich gehe aber davon aus, dass es zu einem Preis nur einen Zwerg gibt (eine Grundform oder eine Variante). Es ist nun ineffizient, den obigen Join zu verwenden, weil er dann tatsächlich erstmal den fetten Join machen muss. Statt dessen wäre ein UNION nützlich, um entweder nach Zwergen oder nach Zwergvarianten zu suchen.

SELECT z.name, z.variante, p.filiale, p.preis
FROM preise p
JOIN (Select g.nummer, g.name, null as variante FROM zwerge g
      WHERE g.nummer = p.zwergNummer
   UNION
      Select v.nummer, g.name, v.variante FROM zwerge g, zwergoide v ON v.grundform = g.nummer
      WHERE v.nummer = p.zwergNummer) z
WHERE p.filiale = 'Siebenbergen'

Damit kann er pro Preis einen Index-Seek in die Zwerge- und Zwergoide-Tabellen machen.

Schönen Gruß an Schneewittchen!

Rolf

--
sumpsi - posui - clusi