Recordset, findfirst langsam bei 2 Parametern mit AND oder OR

02/12/2008 - 18:43 von Herbert Gottlieb | Report spam
Hallo,

ich habe die Tabellen einer Access.mdb auf SQL2000 kopiert und nun Problem
mit RecordsetAbfragen (Access 2003)

Tabelle mit 30000 Datensàtzen und unter anderem zwei Felder, ID1 und ID2
Suche ich nach den ersten Datensatz egal ob ID1 oder ID2 bekomme ich das
Ergebnis innerhalb einer Sekunde, Suche iuch nach beide Werte dauert das
rund 85 Sekunden. Irgendwelche Ideen woran das liegt und was kann man da
machen?

set r=currentdb.Openrecordset("Tabelle1", dbopenRecortset,dbseechanges)
r.findfirst "ID1#456" 'gibt es nur einmal in der Tabelle
'Ergebnis in 1 Sek
r.findfirst "ID1#456 AND ID234" 'gibt es natürlich auch nur einmal in
der Tabelle
'Ergebnis in 85 Sekunden
r.findfirst "ID1#456 OR ID234" 'gibt es öfters
'Ergebnis in 44 Sekunden
Diese Ergebnisse sind bereits mit einen Index auf ID1, auf ID2 und einen
auf ID1 +ID2

Ebenso habe ich das mit anderen Tabellen und Feldern probiert, solbald 2
Werte AND oder OR Verknüpft dauert die Abfrage lange

Jedoch bei
set r=currentdb.Openrecordset("Select * FROM Tabelle1 WHERE ID1#456 AND
ID234,", dbopenRecortset,dbseechanges)
r.findfirst "ID1#456 AND ID234" 'gibt es natürlich auch nur einmal in
der Tabelle
ist das Öffnen und das Ergebnis sofort innerhalb 1 Sekunde da

Wer hat hier einen Tipp (ich will nicht überall die Struktur umstellen)?

Danke,
Herbert
 

Lesen sie die antworten

#1 Stefan Dase
03/12/2008 - 06:57 | Warnen spam
Hallo Herbert!

(...)
Jedoch bei
set r=currentdb.Openrecordset("Select * FROM Tabelle1 WHERE ID1#456 AND
ID234,", dbopenRecortset,dbseechanges)
r.findfirst "ID1#456 AND ID234" 'gibt es natürlich auch nur einmal in
der Tabelle
ist das Öffnen und das Ergebnis sofort innerhalb 1 Sekunde da



Genau das ist der richtige Weg, damit forderst du nur einen Datensatz
an. Beim FindFirst dagegen muss die Jet-Engine die Suche übernehmen, im
Zweifel werden dann viele bis alle Datensàtze gelesen.

Das r.FindFirst kannst du dir im o.a. Beispiel übrigens sparen, denn die
SQL-Anweisung macht das gleich mit!

Viele Grüße,
Stefan

Ähnliche fragen