Supportnet / Forum / Datenbanken
Access 2002 Recordset Zugriff extrem langsam
Frage
Hallo,
seit einer Woche sind unsere Clients auf XP umgestellt (vorher WinNT). Unsere Server laufen nach wie vor auf Windows2000.
Unser System ist aufgeteilt in eine Backend und eine Frontend-Datenbank, die beide auf dem Server abgelegt und für die ganze Abteilung zugänglich sind. Der Mitarbeiter startet jeweils nur die Frontenddatenbank.
Nun habe ich folgenden Effekt:
Untenstehende Function (Ermittlung Rückgabewert aus einer Abfrage heraus) dauerte vor Umstellung unseres Access auf XP gerade mal 3sec. Nun dauert das Ganze ca. 40sec.!!! Da wir mehrere solcher functions pro Prozess durchlaufen, summiert sich die Wartezeit für unsere Anwender enorm. Das ist untragbar.
Kann mir jemand helfen?
Hier die Function:
Function fktGetAnzahl()
Dim r As DAO.Recordset
Set r = CurrentDb().OpenRecordset("select count(*) as anz FROM Abfrage1 WHERE Kriterium='1234'", dbOpenSnapshot)
fktGetAnzahl = r!anz
r.Close
Set r = Nothing
End Function
Antwort 1 von Armin
...
nur 'mal so in's blaue:
ich würde die versionen von dao überprüfen (aktuell ist bei mir (XP) 3.6), vielleicht gibt es eine verzögerung bei den funktionsaufrufen.
(interner aufruf alter funktionen, sollte aber eigentlich fehlermeldungen beim kompilieren geben)
gruesse armin
nur 'mal so in's blaue:
ich würde die versionen von dao überprüfen (aktuell ist bei mir (XP) 3.6), vielleicht gibt es eine verzögerung bei den funktionsaufrufen.
(interner aufruf alter funktionen, sollte aber eigentlich fehlermeldungen beim kompilieren geben)
gruesse armin
Antwort 2 von El Bobbele
Moin ruggdc!
Eine Frontend-Datenbank sollte auf jeden Client lokal kopiert werden und von dort aus genutzt werden. Die Tabellenverknüpfungen zeigen dabei nach wie vor ins Netzwerk. Das bringt sicherlich einen spürbaren Geschwindigkeitsschub. Vielleicht hat sich bei der Netzwerkkonfiguration der neuen Clients ein Fehler eingschlichen, z.B. DNS bzw. WINS usw.?
Unabhängig von deinem aktuellen Problem: Du weist CurrentDb nicht an eine Objektvariable zu, sondern nutzt sie direkt. VBA hat in solchen Fällen nicht selten Schwierigkeiten mit der anschliessendenden Vernichtung dieser Objekte am Prozedurende. Stattdessen solltest du besser eine Objektvariable nutzen und anschliessend auf ihr herumreiten:
So müssten die VBA-Aufräumarbeiten besser ablaufen.
Als Alternative bietet sich auch die DCount-Funktion an:
Gruss
El Bobbele
Eine Frontend-Datenbank sollte auf jeden Client lokal kopiert werden und von dort aus genutzt werden. Die Tabellenverknüpfungen zeigen dabei nach wie vor ins Netzwerk. Das bringt sicherlich einen spürbaren Geschwindigkeitsschub. Vielleicht hat sich bei der Netzwerkkonfiguration der neuen Clients ein Fehler eingschlichen, z.B. DNS bzw. WINS usw.?
Unabhängig von deinem aktuellen Problem: Du weist CurrentDb nicht an eine Objektvariable zu, sondern nutzt sie direkt. VBA hat in solchen Fällen nicht selten Schwierigkeiten mit der anschliessendenden Vernichtung dieser Objekte am Prozedurende. Stattdessen solltest du besser eine Objektvariable nutzen und anschliessend auf ihr herumreiten:
Dim dbCurrent As Database
Dim r As Recordset
Set dbCurrent = CurrentDb
Set r = dbCurrent.OpenRecordset(....)So müssten die VBA-Aufräumarbeiten besser ablaufen.
Als Alternative bietet sich auch die DCount-Funktion an:
Function fktGetAnzahl()
fktGetAnzahl = Nz(DCount("*", "Abfrage", "Kriterium='1234'"), 0)
End FunctionGruss
El Bobbele
Antwort 3 von ruggdc
Hallo Armin,
danke für Deinen Tip, ich habe auch den 3.6er DAO (nochmal gelöscht und wieder frisch eingebunden). Problem existiert immer noch.
Hallo El Bobbele,
Deinen Tip werde ich ausprobieren und rückmelden, der klingt gut. Danke.
danke für Deinen Tip, ich habe auch den 3.6er DAO (nochmal gelöscht und wieder frisch eingebunden). Problem existiert immer noch.
Hallo El Bobbele,
Deinen Tip werde ich ausprobieren und rückmelden, der klingt gut. Danke.

