SQL - Performance-Frage SELECT UNION vs langer WHERE-Abschnitt

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Zvoni

Erfahrenes Mitglied
Guten Morgen.
Hintergrund:
Ich soll einen Business-Report generieren, welcher
1) Ein Brett an Daten (mehrere 1000 Zeilen) aus einer Detail-Tabelle holt ("Verkäufe")
2) zur besseren Darstellung soll ich den Kundennamen mitliefern, welcher aus einer Master-Table kommt ("Kunden")
3) Die Verknüpfung zwischen beiden Tabellen sind jedoch zwei Spalten: Kundennr. und Abladestelle

Aus dem Ärmel weiss ich jetzt zwei Methoden:
SQL:
SELECT DISTINCT T1.IrgendwelcheFelder As Felder, T2.EinKundenName As Kunde
    FROM Verkauf As T1
    INNER JOIN Kunden As T2
    ON
    T1.KDNR=T2.KDNR AND
    T1.VENR=T2.VENR
    WHERE T1.KDNR=ErsteKundenNummer AND T1.VENR=1
UNION
SELECT DISTINCT T1.IrgendwelcheFelder As Felder, T2.EinKundenName As Kunde
    FROM Verkauf As T1
    INNER JOIN Kunden As T2
    ON
    T1.KDNR=T2.KDNR AND
    T1.VENR=T2.VENR
    WHERE T1.KDNR=ZweiteKundenNummer AND T1.VENR=6
usw.
SQL:
SELECT DISTINCT T1.IrgendwelcheFelder As Felder, T2.EinKundenName As Kunde
    FROM Verkauf As T1
    INNER JOIN Kunden As T2
    ON
    T1.KDNR=T2.KDNR AND
    T1.VENR=T2.VENR

    WHERE (T1.KDNR, T1.VENR) IN (VALUES (ErsteKundenNummer, 1),(ZweiteKundenNummer, 3))
Ich habe jetzt mal im Beispiel nur zwei KundenNummern, aber es handelt sich derzeit bereits um min. 40 Kundennummern, welche in Zukunft sogar mehr werden.

Das ganze wird aus VBA (Excel) aus aufgerufen, also wird das SQL-Statement mehr oder weniger dynamisch im Code zusammengebaut (Bitte nicht mit Parameter etc. anfangen. Hab nicht viel Zeit dafür)

Hat jemand Erfahrungswerte was performanter ist?
Meinungen?

EDIT: Datenbank ist eine IBM DB2 auf einer iSeries
 

Yaslaw

n/a
Moderator
Ist natürlich unterschiedlich und für Performance-Verbesserungen muss man sich herantasten.
UNION würde ich nicht machen.
Grundsätzlich, je früher gefiltert wird, umso schneller der JOIN. Also vor dem JOIN filtern
Ich gehe mal davon aus, dass die Kundentabelle die Kleinere der Beiden ist. Dann würde ich den Filter auf diese setzen.
Bei beiden Tabellen einen Index auf KDNR, VENR setzen. Beim Kunden ev. sogar zusätzlich einen auf KDNR, VENR, EinKundenName. Dann kann die DB ev. mit einem Index Only arbeiten und spart sich den Zugriff auf die Tabelle
SQL:
SELECT DISTINCT v.IrgendwelcheFelder As Felder, k.EinKundenName As Kunde
FROM
    verkauf As v
    INNER JOIN (
        -- Nur die Felder auswählen, die wirklich gebraucht werden
        select KDNR, VENR, EinKundenName
        from Kunden
        where (KDNR, VENR) IN (VALUES (ErsteKundenNummer, 1),(ZweiteKundenNummer, 3))
    ) As k
    ON v.KDNR=k.KDNR AND v.VENR=k.VENR
 

Zvoni

Erfahrenes Mitglied
Hmm, ok.
An die Variante habe ich jetzt nicht gedacht, da ich irgendwie eine nicht nachvollziehbare Abneigung gegen eingebettete SELECT's habe (Keine Ahnung warum).
Das mit den Indizes ist richtig, habe ich aber keinen Zugriff drauf (bzw. kann nicht entscheiden, dass auf genannte Felder ein Index erzeugt wird)
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…