Geschwindigkeitsproblem in Schleife mit Abfragenerstellung und Öffnen von Recordsets

04/08/2010 - 14:58 von Guido Schimmrigk | Report spam
Hallo NG,

ich habe ein Geschwindigkeitsproblem bei einer Schleife; und zwar steigt
die Zeit pro Schleifendurchlauf je Durchlauf an: von 1,3 sec bis auf 4,5
sec bei nur 24 Durchlàufen

Von FORM 1 und FORM 2 (siehe im Code unten) habe ich jeweils 6-7
Konstrukte in dieser Schleife.

Woher kommt der Anstieg der Durchlaufzeit?

- habe schon close-Anweisungen und set xxx=nothing weggelassen: bringt
nichts
- die Abfragen muss ich zur Laufzeit erstellen wegen des jeweiligen Datums
- die Suche in rst erfolgt in einer lokalen Tabelle mit 21.000 DS
- geschrieben nach rst1 wird im Netz (18 Werte je Durchlauf) z.Z. 200 DS
- querydef ist auch lokal

Bin für alle Anregungen, Erfahrungen und Tipps dankbar.


(Die Syntax stimmt hier wegen der Zeilenumbrüche nicht genau, der Code
làuft bei mir aber durch)

*************************************************************************
Set rst = dbs.OpenRecordset("Rohdaten_Buffer", dbOpenDynaset)
Set rst1 = dbs.OpenRecordset("ALL_II_Stundendaten")

While (aktDatum <= EndDatum) And flag_Generieren

DoEvents
'****ANFANG FORM 1****
Set qdf = dbs.QueryDefs("Help_qdf")
qdf.SQL = "SELECT Sum(KWZ_Wert) AS Sum_KWZ_Wert" & _
" FROM KorrekturWerteZaehler" & _
" HAVING ((KWZ_Schluessel='KorrekturWert_EIN_ALL_II')" & _
" AND (CDate(KWZ_Datum & ' ' & KWZ_Uhrzeit)>" &
MakeQueryDateTime("01.04." & Year(Now),
"06:00:00", 3) & ")" & _
" AND (CDate(KWZ_Datum & ' ' & KWZ_Uhrzeit)<=" &
MakeQueryDateTime(aktDatum, aktDatum, 3) & "))"

qdf.Close
'Set qdf = Nothing

Set rst2 = qdf.OpenRecordset()
KorrekturWert_EIN_ALL_II = Nz(rst2!Sum_KWZ_Wert, 0)
rst2.Close
Set rst2 = Nothing
'****ENDE FORM 1****

With rst1

On Error GoTo InputError 'wenn vorhanden (Datum+Zeit) dann Error,
sonst angefügt
.AddNew
!ALL_II_StdDaten_Datum = Format(aktDatum, "short date")
!ALL_II_StdDaten_Uhrzeit = Format(aktDatum, "hh:mm:ss")
.Update

On Error GoTo 0

'egal ob DS vorhanden war oder neuangelegt wurde, DS kann jetzt
editiert/überchrieben werden
rst1.FindFirst "(CDate(ALL_II_StdDaten_Datum & ' ' &
ALL_II_StdDaten_Uhrzeit)=" & MakeQueryDateTime(aktDatum, aktDatum, 3)
& ")"

.edit

'****ANFANG FORM 2****
rst.FindFirst "((CDate(RohdatenSP4 & ' ' & RohdatenSP41)=" &
MakeQueryDateTime(aktDatum, aktDatum, 3) & ") AND (RohdatenSP9='" &
key_FQC57_7 & "'))"

If Not rst.NoMatch Then

my_Rate_FQC57_7 = rst!RohdatenSP6 - my_FQC57_7 'StundenDifferenz
my_FQC57_7 = rst!RohdatenSP6 'neuen letzten Wert behalten
Else
flag = False
WriteDatenfehler "my_FQC57_7", Format(aktDatum, "short date"),
Format(aktDatum, "hh:mm:ss")
End If

If my_Rate_FQC57_7 = 0 Then

my_Rate_51_AUS = 0

my_Rate_52_AUS = 0

Else

If my_Rate_FQCVA52 > 0 Then

my_Rate_51_AUS = my_Rate_FQC57_7 - my_Rate_FQCVA52

my_Rate_52_AUS = my_Rate_FQCVA52

Else

my_Rate_51_AUS = my_Rate_FQC57_7

my_Rate_52_AUS = 0

End If

End If

!ALL_II_StdDaten_Rate_51_AUS = my_Rate_51_AUS
!ALL_II_StdDaten_Rate_52_AUS = my_Rate_52_AUS
'****ENDE FORM 2****

.update

end with

aktDatum = DateAdd("h", 1, aktDatum)
aktDatum1 = DateAdd("h", 1, aktDatum1)

wend
*****************************************************************************

Sub WriteDatenfehler(WD_Wert As String, WD_Datum As Date, WD_Uhrzeit As
Date)

Dim dbs As DAO.Database
Dim rst As DAO.Recordset

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Datenfehler")

With rst

.AddNew
!DatenfehlerDatum = WD_Datum
!DatenfehlerUhrzeit = WD_Uhrzeit
!DatenfehlerWertName = WD_Wert
.Update

End With

dbs.Close

Set dbs = Nothing
Set rst = Nothing

End Sub



Danke

WINXP, Access 2003
 

Lesen sie die antworten

#1 Guido Schimmrigk
10/08/2010 - 13:42 | Warnen spam
Guido Schimmrigk schrieb:
Hallo NG,



Hallo,

nachdem sich die Anteilnahme hier sehr in Grenzen hielt :-( und ;-),
habe ich durch probieren folgendes rausgefunden:

*************************************************************************
Set rst = dbs.OpenRecordset("Rohdaten_Buffer", dbOpenDynaset)
Set rst1 = dbs.OpenRecordset("ALL_II_Stundendaten")

While (aktDatum <= EndDatum) And flag_Generieren

DoEvents
'****ANFANG FORM 1****
Set qdf = dbs.QueryDefs("Help_qdf")
qdf.SQL = "SELECT Sum(KWZ_Wert) AS Sum_KWZ_Wert" & _
" FROM KorrekturWerteZaehler" & _
" HAVING ((KWZ_Schluessel='KorrekturWert_EIN_ALL_II')" & _
" AND (CDate(KWZ_Datum & ' ' & KWZ_Uhrzeit)>" &
MakeQueryDateTime("01.04." & Year(Now),
"06:00:00", 3) & ")" & _
" AND (CDate(KWZ_Datum & ' ' & KWZ_Uhrzeit)<=" &
MakeQueryDateTime(aktDatum, aktDatum, 3) & "))"

qdf.Close
'Set qdf = Nothing

Set rst2 = qdf.OpenRecordset()
KorrekturWert_EIN_ALL_II = Nz(rst2!Sum_KWZ_Wert, 0)
rst2.Close
Set rst2 = Nothing
'****ENDE FORM 1****



Set qdf = dbs.QueryDefs("Help_qdf")
qdf.SQL = "SELECT Sum(KWZ_Wert) AS Sum_KWZ_Wert" & _

wird ersetzt durch

Set rst2 = dbs.OpenRecordset(SQL-String)

dann erfolgt der Zugriff auf die Daten in rst2

Ebenso wird

rst1.FindFirst "(CDate(ALL_II_StdDaten_Datum & ' ' &
ALL_II_StdDaten_Uhrzeit)=" & MakeQueryDateTime(aktDatum, aktDatum, 3)
& ")"



durch

Set rst2 = dbs.OpenRecordset("Select * From Where ...

ersetzt.

Und siehe da, die Durchlaufzeit erhöht sich noch, jedoch um
Zehntel-Sekunden von 0,2 auf 0,5 sec bei 24 Durchlàufen. Die Gesamtzeit
reduziert sich von 1:12 min auf 0:07 min

Die jetzige Erhöhung der Durchlaufzeit führe ich auf das 'Aufblàhen' der
Datenbank zur Laufzeit zurück. Kann man zwischendurch (hier nach z.B.
100 Durchlàufen)temporàre von Access verwaltete Daten/Tabellen
komprimieren/löschen?


Gruß Guido

Ähnliche fragen