
70620
04.12.2008, aktualisiert um 14:16:12 Uhr
Abfrage durch Parameter langsamer?
Hallo zusammen
ich habe hier eine Abfrage wo ich nach Datum selektiere. Die Tabelle hat einige Millionen Datensätze und ist aufs Datum optimiert.
Also
Das geht ruckzuck.. ca 3sek
Schreibe ich jedoch
und fülle die Werte aus, dauerts über eine Minute. Die Abfrage starte ich direkt per Mausklick.
Woran kann dies nun liegen? Akzeptiert er die Eingaben nicht als Datum?
thx4help
ich habe hier eine Abfrage wo ich nach Datum selektiere. Die Tabelle hat einige Millionen Datensätze und ist aufs Datum optimiert.
Also
>=#01.01.2008# Und <=#31.01.2008#
Schreibe ich jedoch
>=[begin] Und <=[end]
Woran kann dies nun liegen? Akzeptiert er die Eingaben nicht als Datum?
thx4help
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 103299
Url: https://administrator.de/forum/abfrage-durch-parameter-langsamer-103299.html
Ausgedruckt am: 27.04.2025 um 09:04 Uhr
10 Kommentare
Neuester Kommentar
Es würde helfen, die ganze Abfrage zu sehen.
Aber mal so ins Blaue hinein:
Kann es sein, daß [begin] und [end] Spalten in der Tabelle sind und Du damit Access zwingst für jede Zeile in der Tabelle einen neuen Vergleich zu machen da möglicherweise in jeder Zeile die Werte von Begin und End anders sind?
Das ist natürlich aufwendiger als einfach nur einen festen Bereich aus der DB zu selektieren.
Aber mal so ins Blaue hinein:
Kann es sein, daß [begin] und [end] Spalten in der Tabelle sind und Du damit Access zwingst für jede Zeile in der Tabelle einen neuen Vergleich zu machen da möglicherweise in jeder Zeile die Werte von Begin und End anders sind?
Das ist natürlich aufwendiger als einfach nur einen festen Bereich aus der DB zu selektieren.
Ich finde, das sollte funktionieren.
Falls Access Proble beim Konvertieren der Variablen in ein Datum hat, könnte man mal folgendes ausprobieren:
Aber eigentlich finde ich auch, daß es da keinen Unterschied geben sollte.
Falls Access Proble beim Konvertieren der Variablen in ein Datum hat, könnte man mal folgendes ausprobieren:
SELECT PRUEFSTART
FROM TBL
WHERE (((TBL.PRUEFSTART)>=CDate([begin]) And (TBL.PRUEFSTART)<=CDate([end])));
Als Ursache bleibt eigentlich dann nur noch, daß Access bei Verwendung von Variablen nicht erkennt, daß er einen passenden Index hat und auf einen Full Table Scan umschwenkt.
Auf einem SQL Server könnte man das mit dem Query Optimizer rauskriegen, bei Access kenne ich keine Möglichkeit rauszubekommen was er tatsächlich macht oder in die Indexverwendung einzugreifen.
Auf einem SQL Server könnte man das mit dem Query Optimizer rauskriegen, bei Access kenne ich keine Möglichkeit rauszubekommen was er tatsächlich macht oder in die Indexverwendung einzugreifen.
Moin fiacyberz,
Du darfst nicht immer so ablehnend mit diesem M$-Geraffel umgehen
- verwende ruhig auch mal zumindest die dokumentierten Features.
Deklariere die Eingabeparameter "begin" und "end" in der Abfrage.
Dokumentierte Syntax:
P.S. Ich würde NICHT Worte wie "begin" und "end" als Variablennamen in dürftig dokumentierten Umgebungen wählen.
Nimm lieber die deutschen Worte "Beginn" und "Ende" oder aber so etwas wie "dBegin" und "dEnd".
Grüße
Biber
Du darfst nicht immer so ablehnend mit diesem M$-Geraffel umgehen
- verwende ruhig auch mal zumindest die dokumentierten Features.
Deklariere die Eingabeparameter "begin" und "end" in der Abfrage.
Dokumentierte Syntax:
PARAMETERS begin date, end date;
SELECT PRUEFSTART
FROM TBL
WHERE (((TBL.PRUEFSTART)>=[begin] And (TBL.PRUEFSTART)<=[end]));
P.S. Ich würde NICHT Worte wie "begin" und "end" als Variablennamen in dürftig dokumentierten Umgebungen wählen.
Nimm lieber die deutschen Worte "Beginn" und "Ende" oder aber so etwas wie "dBegin" und "dEnd".
Grüße
Biber
Moin fiacyberz,
wenn es dann über dieses dynamische SQL zu lange dauert, dann mach doch aus dieser Winz-Abfrage eine Stored Procedure mit zwei Parametern dBegin/dEnd, die das Ganze dann serverseitig abfackelt.
Dann ist die Abfrage kompiliert, oprimiert und ohnehin 2000x schneller, als Du sie vom Client aus jemals abschiessen kannst.
Grüße
Biber
wenn es dann über dieses dynamische SQL zu lange dauert, dann mach doch aus dieser Winz-Abfrage eine Stored Procedure mit zwei Parametern dBegin/dEnd, die das Ganze dann serverseitig abfackelt.
Dann ist die Abfrage kompiliert, oprimiert und ohnehin 2000x schneller, als Du sie vom Client aus jemals abschiessen kannst.
Grüße
Biber