Datensatz über VBA hinzufügen (recordset.AddNew) dauert ewig
Hallo zusammen,
ich hab eine Access-Datenbank (Frontend). Als Backend verwende ich MS SQL Server 2008.
Mein Problem besteht darin, dass ich ein Log-Tabelle habe, die mittlerweile ca. 350.000 Datensätze enthält.
Wenn ich jetzt über diesen VBA-Code eine neuen Datensatz in die Tabelle schreibe, dauert es ca. 1-2 Sekeunden.
Ich hab jetzt zum Testen eine leere Tabelle mit gleicher Struktur angelegt. Da wird der Datensatz ohne merkliche verzögerung eingetragen (also weniger als 0,5 Sec).
Hat da einer von euch eine Idee, wie man das schneller hinbekommt? (eine leere Tabelle ist ja nicht wirklich die lösung)
mfg
n4426
ich hab eine Access-Datenbank (Frontend). Als Backend verwende ich MS SQL Server 2008.
Mein Problem besteht darin, dass ich ein Log-Tabelle habe, die mittlerweile ca. 350.000 Datensätze enthält.
Wenn ich jetzt über diesen VBA-Code eine neuen Datensatz in die Tabelle schreibe, dauert es ca. 1-2 Sekeunden.
Ich hab jetzt zum Testen eine leere Tabelle mit gleicher Struktur angelegt. Da wird der Datensatz ohne merkliche verzögerung eingetragen (also weniger als 0,5 Sec).
Hat da einer von euch eine Idee, wie man das schneller hinbekommt? (eine leere Tabelle ist ja nicht wirklich die lösung)
Dim DB As Database
Dim rs As Recordset
Set DB = CurrentDb()
' Benutzerdaten
Set rs = DB.OpenRecordset("TBL_History", dbOpenDynaset, dbSeeChanges)
rs.AddNew
rs!ID = logIDNr
rs!Tabelle = "TBL_123"
rs!User = thisUser.ID
rs!Date = Date + Time
rs!Feld = logFeld
rs!WertALT = logWertAlt
rs!WertNEU = logWertneu
rs.Update
rs.Close
DB.Close
mfg
n4426
Please also mark the comments that contributed to the solution of the article
Content-ID: 170011
Url: https://administrator.de/contentid/170011
Printed on: November 11, 2024 at 10:11 o'clock
4 Comments
Latest comment
Moin Moin,
ich vermute mal, dass ein oder mehrere Indexe in der Tabelle definiert sind. Das verzögert natürlich die Zugriffszeit.
Auch würde ich vor dem rs.AddNew ein rs.MoveLast einfügen. Das sollte das Schreiben beschleunigen.
Grundsätzlich ist die Frage: Wann wird diese Historie geschrieben? So wie ich das sehe, bei jeder Änderung in einem Feld!?
Das ist imho übertrieben. Wenn das Formular verlassen wird, könnten die geänderten Feldinhalte alle auf einmal geschrieben werden.
Wenn wirklich bei jeder Änderung eines Feldes diese Prozedur aufgerufen wird, solltest du nicht jedes mal den Recordset öffnen und wieder schließen.
Halte Ihn offen und schließe ihn wenn das Programm beendet wird.
Zusätzlich würde ich noch die ODBC Einstellungen von Access prüfen und reduzieren. Sorry, da gibt es keine Vorgabewerte, es hilft nur try & error in Abhängigkeit von der Umgebung.
Du solltest dir auch langfristig eine Lösung einfallen lassen, denn die Datensätze werden nicht weniger.
Vielleicht lässt es sich vereinbaren, dass nur der alte Wert mit User-ID und Zeit/Datum gespeichert wird, dann könnte man die bestehende Tabelle um diese Felder einfach erweitern.
Beispiel:
Aktuelles_Feld
Alter_Feldwert
User-ID
Datum/Zeit
Du hättest dann pro Feld natürlich drei zusätzliche Felder in der Tabelle, die du aber auch zu einem Feld zusammenfassen könntest. Historie = User-ID & "|" & Datum/Zeit & "|" & Alter_Feldwert
Der Vorteil, man könnte sehr schnell auf die alten Werte zugreifen
Grüße aus Rostock
Wolfgang
(Netwolf)
ich vermute mal, dass ein oder mehrere Indexe in der Tabelle definiert sind. Das verzögert natürlich die Zugriffszeit.
Auch würde ich vor dem rs.AddNew ein rs.MoveLast einfügen. Das sollte das Schreiben beschleunigen.
Grundsätzlich ist die Frage: Wann wird diese Historie geschrieben? So wie ich das sehe, bei jeder Änderung in einem Feld!?
Das ist imho übertrieben. Wenn das Formular verlassen wird, könnten die geänderten Feldinhalte alle auf einmal geschrieben werden.
Wenn wirklich bei jeder Änderung eines Feldes diese Prozedur aufgerufen wird, solltest du nicht jedes mal den Recordset öffnen und wieder schließen.
Halte Ihn offen und schließe ihn wenn das Programm beendet wird.
Zusätzlich würde ich noch die ODBC Einstellungen von Access prüfen und reduzieren. Sorry, da gibt es keine Vorgabewerte, es hilft nur try & error in Abhängigkeit von der Umgebung.
Du solltest dir auch langfristig eine Lösung einfallen lassen, denn die Datensätze werden nicht weniger.
Vielleicht lässt es sich vereinbaren, dass nur der alte Wert mit User-ID und Zeit/Datum gespeichert wird, dann könnte man die bestehende Tabelle um diese Felder einfach erweitern.
Beispiel:
Aktuelles_Feld
Alter_Feldwert
User-ID
Datum/Zeit
Du hättest dann pro Feld natürlich drei zusätzliche Felder in der Tabelle, die du aber auch zu einem Feld zusammenfassen könntest. Historie = User-ID & "|" & Datum/Zeit & "|" & Alter_Feldwert
Der Vorteil, man könnte sehr schnell auf die alten Werte zugreifen
Grüße aus Rostock
Wolfgang
(Netwolf)