Rolf B: SQL-Abfrage Effizienz?

Beitrag lesen

Hallo Sven,

2 Tabellen identisch viele Einträge zu einer ID innerhalb eines Vorganges XY

Normalerweise würde ich jetzt einen FULL OUTER JOIN über beide Tabellen vorschlagen, aber das ist ein SQL Feature, das MYSQL bis heute nicht unterstützt. Mit dem könntest Du dann schauen, ob in einer der beiden Tabellen für die ID der NULL-Wert herauskommt. Natürlich gibt es diverse Möglichkeiten, einen FULL JOIN zu nachzubilden. Aber das ergibt keine einfachere Lösung als das, was Du schon hast.

So kann ich Dir nur noch UNION ALL vorschlagen statt UNION, weil das Weglassen der ALL Option einen weiteren Durchlauf durch das Ergebnis produziert, der Duplikate entfernen soll. Die sind in deiner Abfrage aber nicht möglich.

Statt NOT IN (SELECT ID ...) könnte man auch NOT EXISTS verwenden, aber das ändert nichts an dem, was der Server daraus macht. Zumindest entsteht bei mir daraus der gleiche EXPLAIN. Ich habe im unten stehenden Statement mal die NOT EXISTS Variante für den zweiten Teil aufgeschrieben, falls Du nicht weißt, was ich meine. Du kannst ja bei deiner DB mal schauen, ob Du damit einen günstigeren EXPLAIN bekommst (meine war vielleicht zu klein), aber ich glaube nicht dran.

Du könntest die SELECT Liste noch um eine Tabellenkennung erweitern, damit Du weißt, in welcher Tabelle eine überzählige ID steht.

SELECT 'Tabelle1' as Quelle, ID 
FROM tabelle1 
WHERE Vorgang='XY' 
  AND ID NOT IN (SELECT ID FROM tabelle2 WHERE Vorgang='XY')
UNION ALL
SELECT 'Tabelle2' as Quelle, ID 
FROM tabelle2 
WHERE Vorgang='XY' 
  AND NOT EXISTS (SELECT * FROM tabelle1 
                  WHERE Vorgang='XY'
                    AND tabelle1.ID = tabelle2.ID)

Was auf jeden Fall auch hilft, ist je ein Index auf Vorgang und ID.

Rolf

--
sumpsi - posui - obstruxi