Hallo!
Post by Peter DoeringPost by Josef Poetzl[...]
[...]
D) gespeicherte Abfrage (die von Peter erwähnte Variante)
SELECT Feld1, Feld2 FROM Tabelle INNER JOIN FilterWertTab
ON Tabelle.FilterFeld = FilterWertTab.WertFeld
Die Laufzeiten aller Varianten außer D und G lagen Bereich von 20 bis
30 ms. Für D und G wurden mehr als 2 sec benötigt.
Interessant ist, dass es kaum einen Unterschied ausmachte, ob die
verknüpfte Tabelle im FE bzw die Tabelle direkt im BE verwendet wird.
Ich hätte nicht vermutet, dass ein INNER JOIN soviel ausmacht.
Und daher habe ich auch einmal outer join versucht. =>
Laufzeit im Bereich 20-30 ms!
Hast du das jeweils einmalig oder mehrmals hintereinander probiert? Es kann
durchaus sein, dass das erstemal laenger dauert und wenn alles brav im
Speicher liegt, superschnell laeuft.
Mehrmals hintereinander; Varianten untereinander getauscht; DB
mehrmals komprimiert; unabhängig vom Test ein Recordset geöffnet
gehalten; ... ;-)
Post by Peter Doering- Wieviele Saetze enthaelt FilterWertTab?
Exakt einen.
Post by Peter Doering- Index auf WertFeld ist vorhanden, oder?
Aber natürlich. ;-)
Jetzt habe ich es mir einmal genauer im _JET_;-)-Showplan angesehen.
Dabei fand ich etwas, was ich nicht verstehe.
Folgendes tritt bei inner join auf:
- Inputs to Query -
Table 'tabFilterWert'
Database 'F:\Test\testBE.mdb'
Table 'tTestDaten'
Database 'F:\Test\testBE.mdb'
Using index 'fiGruppe'
Having Indexes:
fiGruppe 2097136 entries, 1947 pages, 512 values
which has 1 column, fixed
- End inputs to Query -
01) Inner Join table 'tabFilterWert' to table 'tTestDaten'
using index 'tTestDaten!fiGruppe'
join expression "tabFilterWert.FilterWert=tTestDaten.fiGruppe"
=> Index wird verwendet. So sollte es sein.
Nun start ich diese Abfrage über OpenRecordset(...)
- Inputs to Query -
Table 'tabFilterWert'
Database 'F:\Test\testBE.mdb'
Table 'tTestDaten'
Database 'F:\Test\testBE.mdb'
- End inputs to Query -
01) Sort table 'tabFilterWert'
02) Inner Join table 'tTestDaten' to result of '01)'
using temporary index
join expression "tTestDaten.fiGruppe=tabFilterWert.FilterWert"
Das verstehe ich nicht. Warum wird hier ein "temporary index"
verwendet?
Das Problem bei inner join tritt nur dann auf, wenn ich per Snapshot
öffne - bei Dynaset wird der Index verwendet.
(Ich testete aber mit Snapshot, da ich das Verhalten eines
Kombinationsfeldes nachempfinden wollte. - und Kombifelder verwenden
imo Snapshot, oder?)
db.OpenRecordset("qGeschwindigkeitsTest_INNERJOIN", dbOpenDynaset)
=> Index wird genutzt
db.OpenRecordset("qGeschwindigkeitsTest_INNERJOIN", dbOpenSnapshot)
=> Index wir nicht genutzt
Und Warum?
Bei outer join sieht das Ergebnis im showplan gleich aus - egal ob
über das Datenbankfenster geöffnet oder per OpenRecordset.
Table 'tTestDaten'
Database 'F:\Test\testBE.mdb'
Using index 'fiGruppe'
Having Indexes:
fiGruppe 2097136 entries, 1947 pages, 512 values
which has 1 column, fixed
Table 'tabFilterWert'
Database 'F:\Test\testBE.mdb'
- End inputs to Query -
01) Outer Join table 'tabFilterWert' to table 'tTestDaten'
using index 'tTestDaten!fiGruppe'
join expression "tabFilterWert.FilterWert=tTestDaten.fiGruppe"
mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/