ACC2000: Abfrage mit Nicht in (Select...) / Auswertezeit

24/09/2007 - 20:02 von Michael Hessler | Report spam
Hallo,

für ein komplexeres Formular mit sechs Seiten
Registersteuerelement habe ich mehrere Abfragen àhnlich wie:

SELECT T_PD.[ID], T_PD.PD AS Datum, T_PD.Uhrzeit, T_PD.D
FROM [T_PD]
WHERE (((T_PD.[ID]) Not In
(SELECT [T_FMiPlNM].[ID-Pl] FROM [T_FMiPlNM];))
AND ((T_PD.Datum)>=#6/1/2007#) AND ((T_PD.FC)=0))
ORDER BY T_PD.[ID];

Tabelle T_PD: ca. 5.220 Datensàtze
Tabelle T_FMiPlNM: 5.860 Datensàtze

Zeitbedarf für Ausführen der Abfragen:
- ohne "Not In" ...: < 1 Sekunde, 1.288 Datensàtze angezeigt
- nur "Not In" ...: < 1 Sekunde, 5.863 Datensàtze angezeigt
- vollstàndig wie oben: ca. 15 s, 128 Datensàtze angezeigt.

Meine Fragen:
Warum braucht die vollstàndige Abfrage (mit "Not In"-Teil) - ca.
zehnmal im Vergleich zu den beiden Teilen - so lange?

Wie kann ich solche Abfragen / Vorgànge beschleunigen? Wie
gesagt, werden im Formular mehrere solcher Konstruktionen
benötigt, so dass die Wartezeit bis zur Anzeige des ersten
Datensatz zu lange ist.

Danke
Michael
 

Lesen sie die antworten

#1 Karl Donaubauer
24/09/2007 - 20:33 | Warnen spam
Michael Hessler wrote:
für ein komplexeres Formular mit sechs Seiten
Registersteuerelement habe ich mehrere Abfragen àhnlich wie:

SELECT T_PD.[ID], T_PD.PD AS Datum, T_PD.Uhrzeit, T_PD.D
FROM [T_PD]
WHERE (((T_PD.[ID]) Not In
(SELECT [T_FMiPlNM].[ID-Pl] FROM [T_FMiPlNM];))
AND ((T_PD.Datum)>=#6/1/2007#) AND ((T_PD.FC)=0))
ORDER BY T_PD.[ID];

Tabelle T_PD: ca. 5.220 Datensàtze
Tabelle T_FMiPlNM: 5.860 Datensàtze

Zeitbedarf für Ausführen der Abfragen:
- ohne "Not In" ...: < 1 Sekunde, 1.288 Datensàtze angezeigt
- nur "Not In" ...: < 1 Sekunde, 5.863 Datensàtze angezeigt
- vollstàndig wie oben: ca. 15 s, 128 Datensàtze angezeigt.

Meine Fragen:
Warum braucht die vollstàndige Abfrage (mit "Not In"-Teil) - ca.
zehnmal im Vergleich zu den beiden Teilen - so lange?

Wie kann ich solche Abfragen / Vorgànge beschleunigen? Wie
gesagt, werden im Formular mehrere solcher Konstruktionen
benötigt, so dass die Wartezeit bis zur Anzeige des ersten
Datensatz zu lange ist.



Viele Unterabfragen sind mit JET langsam.
Wenn's eine Unterabfrage sein soll, ist evtl. schneller:

SELECT T_PD.[ID], T_PD.PD AS Datum, T_PD.Uhrzeit, T_PD.D
FROM [T_PD]
WHERE

NOT EXISTS
(SELECT [T_FMiPlNM].[ID-Pl] FROM [T_FMiPlNM]
WHERE [T_FMiPlNM].[ID-Pl] = T_PD.[ID])

AND ((T_PD.Datum)>=#6/1/2007#) AND ((T_PD.FC)=0))
ORDER BY T_PD.[ID];


Noch schneller dürfte aber ein LEFT JOIN mit NULL-Prüfung statt
der Unterabfrage sein. S.

Datensàtze aus A, die nicht in B sind
www.donkarl.com?FAQ3.16


HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com + Info zur
Access-Entwickler-Konferenz (AEK10) im Oktober in Nürnberg

Ähnliche fragen