Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Nochmals Query optimieren

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von knabnetaD, 18 Oktober 2012.

  1. knabnetaD

    knabnetaD Benutzer

    Hallo Zusammen,
    ich habe mich hier vor einiger Zeit schonmal gemeldet,
    weil ich Hilfe beim Optimieren einer Query brauche.

    Nun ist es wieder so weit.
    Habe eure Tipps mmn so weit möglich befolgt.

    Es geht um folgende Query:
    Code:
    select id, oid, data
    from table1
    where
        exists (select oid
                from table2
                where table2.oid = table1.oid
        and (not exists (select id
                        from table3
                        where table3.id = table1.id)
        and not exists (select id
                        from table4
                        where table4.id = table1.id)))
    In table1 steht jede menge Zeugs drin.
    Die Einträge mit oid aus table2, welche noch nicht in table3 oder table4 drin sind, möchte ich gerne als Ergebnis bekommen.

    id ist dabei der pk.
    oid ist fk und gibt nur an von welchem typ ein eintrag ist.

    Diese Query benötigt ca. 2:30min bis 3min um komplett durchzulaufen.
    Grund wird wohl die Größe von table1 sein (mehrere GB).

    Kann ich die Query trotzdem noch irgendwie optimieren?
    Alle id-Spalten sind auch clustered-index.
    Die oid-Spalten sind unclusterd-index.

    Ich hoffe ihr könnt mir helfen.
    VIELEN DANK!
     
  2. ukulele

    ukulele Datenbank-Guru

    Die ID Spalte in den Tabellen 3 und 4 sollte natürlich auch einen Index haben.

    Du kannst statt not exists select id from table auch not exists select 1 from table machen. Er gibt dann nur eine 1 zurück und nicht die komplette ID, die Bedingung ist aber dennoch wahr. Das wird aber wenn nur einen Hauch bringen.

    Mehr fällt mir nicht ein :)

    Man könnte das ganze als View abbilden oder in einer neuen Tabelle cachen. Oder die Hardware ändern :)
     
    Tommi gefällt das.
  3. Tommi

    Tommi Datenbank-Guru

    Hallo knabnetaD,

    bei einer Datenmenge von mehreren Mio. Zeilen ist die Bearbeitungszeit nun einmal lang. Je nachdem, über welche Menge man hier spricht, sind 2:30 Minuten gar nicht mahl soo schlecht.
    Wenn hier die Datenmenge das Problem ist, hilft nur noch der Tipp von ukulele -> Hardware ändern (z.B.: RAM kann nur ersetzt werden durch noch mehr RAM :) ).

    Etwas Nachdenklich bin ich geworden, als ich folgendes gelesen habe:
    Wenn das deine Anforderung ist, musst du dann nicht nur in tabelle3 und tabelle4 prüfen, ob die oid aus tabelle2 hier vorhanden ist oder nicht?
    Dann müsstest du nämlich nicht mehr auf den Datenbestand von tabelle1 zurückgreifen. Das würde es etwas einfacher und somit natürlich auch viel schneller machen, wenn der Datenbestand in tabelle2, tabelle3 und tabelle4 wesentlich geringer sind als der in tabelle1.

    Viele Grüße,
    Tommi
     
  4. knabnetaD

    knabnetaD Benutzer

    vielen dank für die hilfe.

    habe die query jetzt komplett umgebaut und mich mal den standart-funktionen bedient.
    siehe HIER
    keine ahnung warum ich da nicht früher drauf gekommen bin.
    ich mache ja mit den selbst geschriebenen statements nichts anderes.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden