| 

.NET C# Java Javascript Exception

2
Microsoft Access 2007 ist bei mir unendlich langsam wenn ich eine IN() Bedingung verwende. Beispiel:
SELECT * FROM tab
WHERE id NOT IN( SELECT id From anderetabelle )


Wie kann ich diese Abfrage umformulieren damit sie performanter wird?
News:
30.09.2009
pimpeastwood 41 1 3
3 Antworten
1
Also umformulieren kannst du das ganze SELECT schon:

SELECT tab.* FROM tab, anderetabelle
WHERE tab.id <> anderetabelle.id


Ich würde hier kein SUBSELECT und auch nicht die IN() Funktion benutzen, weil das Ganze auch wesentlich einfacher geht. Aber ob das auch performanter ist, konnte ich leider nicht bestätigen. Bei mir laufen beide SELECTS mit nahezu gleicher Geschwindigkeit:

1) Ausführungszeit: 0,016 Sekunden
2) Ausführungszeit: 0,014 Sekunden


Ich habe es allerdings mit einer Sybase Datenbank ausprobiert. Ich weiß nicht, ob Access hier anders reagiert. Prinzipiell ist es der gleiche Ablauf der hier getätigt werden muss:

Jede Zeile von Tabelle 1 wird mit jeder Spalte von Tabelle 2 verglichen. Prinzipiell also kein Unterschied, es sei denn Access nutzt die IN() Funktion anders. Korrigiert mich wenn ich falsch liege.
01.10.2009
Dustin Klein 2,9k 2 9
1
Der obige Join ist falsch. Wenn schon ein Join dann bitte ein outer join (Keine Ahnung ob/wie Access das unterstützt).

Bei Performance fällt mir aber zuerst die Frage nach fehlenden Indezies/Keys ein.

select tab.*
from tab
left outer join anderetabelle on tab.id=anderetabelle.id
wheer anderetabelle.id is null
BeachBlocker 01.10.2009
Nur der Vollständigkeit halber:
Eine Abfrage mit WHERE NOT IN und die Lösung mit OUTER JOIN und WHERE ... IS NULL liefern nicht in jedem Fall identische Ergebnisse!
Und zwar dann nicht, wenn NULL-Werte im Spiel sind. Sind in "anderetabelle" Nullwerte für "id" enthalten, dann ist das Ergebnis der WHERE NOT IN Abfrage IMMER leer, während die OUTER JOIN Lösung weiterhin eine Treffermenge liefert.
FalkP 02.10.2009
@Dustin Klein [quote]Jede Spalte von Tabelle 1 wird mit jeder Spalte von Tabelle 2 verglichen. Prinzipiell also kein Unterschied, ... Korrigiert mich wenn ich falsch liege.[/quote]
Ja, da muß ich dich korrigieren.
Ein WHERE NOT IN ist nicht das gleiche wie ein INNER JOIN mit <>! Bei beiden werden nur die id-Spalten miteinander verglichen und nicht Jede mit Jeder (Mglws. meinst du hier ja Zeilen). Beim Join wird jede Zeile der Einen mit jeder Zeile der Anderen verglichen und ALLE ausgewählt die ungleich sind, während IN eher einer Oder-Verküpfung entspricht.
FalkP 02.10.2009
Ja meinte natürlich Zeilen -.- Sollte mich mal etwas konzentrieren wenn ich was schreibe. Danke an alle für die Kommentare!
Dustin Klein 03.10.2009
0
oft hilft es, die Abfragenarbeit aufzuteilen

d.h. in diesem Fall: zuerst die Unterabfrage ausführen, die daraus resultierenden IDs mittels RecordSet merken und dann die zweite Abfrage zu starten und die konkreten IDs einzubauen

falls das insgesamt keine Verbesserung bringt, kann man damit aber besser unterscheiden, welche der beiden Abfragen lange läuft (von wegen fehlende Indizes)
08.02.2011
goholger 21 1
0
Vielleicht ist ein join für Access verträglicher:

SELECT tab.* FROM tab
join anderetabelle on tab.id = anderetabelle.id
08.02.2011
alexander 860 2 9

Stelle deine Sql-Frage jetzt!