Nochmals Query optimieren

knabnetaD

Benutzer
Beiträge
12
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!
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
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

Datenbank-Guru
Beiträge
290
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:
Die Einträge mit oid aus table2, welche noch nicht in table3 oder table4 drin sind, möchte ich gerne als Ergebnis bekommen.

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
 
Werbung:

knabnetaD

Benutzer
Beiträge
12
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.
 
Oben