schildi: join abfrage dauert ewigkeiten

hallo,

ich hab 2 tabellen. in einer sind ca 5000 datensätze, in der anderen ca.
11.000. die zweite dient nur zur primärschlüssel zuordnung.
in der ersten kann es primärschlüssel geben (foreign-keys der ersten), die
in der zweiten nicht vorkommen.
wenn ich nun diese schlüssel bekommen will, die in der zweiten tabelle nicht
vorkommen, benötige ich eine LEFT JOIN Abfrage. Wenn ich das mache:

SELECT a.*, b.id FROM tab1 a LEFT OUTER JOIN tab2 b ON a.id = b.id WHERE
b.id IS NULL

bekomme ich ewigkeiten keine Antwort:

Zeige Datensätze 0 - 1 (2 insgesamt, die Abfrage dauerte 35.8430 sek)

Woran kanns liegen?

Danke jeder Hilfe,

Gruß Lars

  1. Hi,

    SELECT a.*,

    das Selektieren von "*" ist außerhalb von Testbetrachtungen sinnfrei. Ich gehe davon aus, dass Du dies hier nur der Vereinfachung wegen geschrieben hast.

    b.id FROM tab1 a LEFT OUTER JOIN tab2 b ON a.id = b.id WHERE
    b.id IS NULL

    Dieses Statement lässt sich optimieren:

    SELECT * FROM a WHERE a IS NULL

    Woran kanns liegen?

    Welches DBMS benutzt Du, welche Indexe hast Du verteilt, welche Strategie verwendet Dein DBMS bei diesem Statement, welche Möglichkeiten der Optimierung bietet es?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. b.id FROM tab1 a LEFT OUTER JOIN tab2 b ON a.id = b.id WHERE
      b.id IS NULL

      Dieses Statement lässt sich optimieren:

      SELECT * FROM a WHERE a IS NULL

      ich verstehe nicht ganz wie du das gesamte statement auf dieses neue optimieren willst? oder willst du nur einen ausschnitt darstellen?
      ich muss in jedem fall einen left join machen, damit ich alle felder der einen tabelle (zweiten) bekomme, die nur in der anderen (ersten) vorhanden sind

      Woran kanns liegen?

      Welches DBMS benutzt Du, welche Indexe hast Du verteilt, welche Strategie verwendet Dein DBMS bei diesem Statement, welche Möglichkeiten der Optimierung bietet es?

      ich verwende mysql. hatte ich ganz vergessen zu erwähnen.
      indexe habe ich keine gesetzt. vor der beschäftigung mit indizes bei mysql habe ich mich bisher gedrückt ;)

      1. Hi,

        ich muss in jedem fall einen left join machen, damit ich alle felder der einen tabelle (zweiten) bekomme, die nur in der anderen (ersten) vorhanden sind

        ach, das ist Dein Ziel. Ich würde MINUS verwenden.

        ich verwende mysql. hatte ich ganz vergessen zu erwähnen.
        indexe habe ich keine gesetzt. vor der beschäftigung mit indizes bei mysql habe ich mich bisher gedrückt ;)

        Dann ist jetzt der ideale Zeitpunkt. Indexe sind neben Tabellen das wichtigste Werkzeug eines DB-Layouts. Knapp an Stelle drei folgen die Statements.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          ich muss in jedem fall einen left join machen, damit ich alle felder der einen tabelle (zweiten) bekomme, die nur in der anderen (ersten) vorhanden sind

          ach, das ist Dein Ziel. Ich würde MINUS verwenden.

          MINUS ? - muss ich mal angucken. kenn ich garnet!

          Aber - ich habe grad bei jeder tabelle einen index für die relevante id-spalte erzeugt. und das ergebnis ist überwältigend!!

          Zeige Datensätze 0 - 1 (2 insgesamt, die Abfrage dauerte 0.2186 sek)

          ich hatte nicht erwartet, dass indizes bei einer schon so 'geringen' tabellengröße so viel ausmachen!

          1. yo,

            ich hatte nicht erwartet, dass indizes bei einer schon so 'geringen' tabellengröße so viel ausmachen!

            5000 * 11.000 = 55.000.000 vergleiche

            Ilja

        2. echo $begrueszung;

          Ich würde MINUS verwenden.

          New Features Planned for the Mid-Term Future: MINUS, ...

          echo "$verabschiedung $name";