Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Datensatz über VBA hinzufügen (recordset.AddNew) dauert ewig

Frage Microsoft Microsoft Office

Mitglied: n4426

n4426 (Level 2) - Jetzt verbinden

19.07.2011, aktualisiert 13:44 Uhr, 36568 Aufrufe, 4 Kommentare

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)


01.
Dim DB As Database 
02.
Dim rs As Recordset 
03.
 
04.
Set DB = CurrentDb() 
05.
 
06.
 
07.
' Benutzerdaten 
08.
Set rs = DB.OpenRecordset("TBL_History", dbOpenDynaset, dbSeeChanges) 
09.
  
10.
    rs.AddNew 
11.
        rs!ID = logIDNr 
12.
        rs!Tabelle = "TBL_123" 
13.
        rs!User = thisUser.ID 
14.
        rs!Date = Date + Time 
15.
        rs!Feld = logFeld 
16.
        rs!WertALT = logWertAlt 
17.
        rs!WertNEU = logWertneu 
18.
    rs.Update 
19.
rs.Close 
20.
 
21.
DB.Close
mfg
n4426
Mitglied: NetWolf
19.07.2011 um 14:40 Uhr
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)
Bitte warten ..
Mitglied: n4426
19.07.2011 um 15:28 Uhr
Hi Wolfgang,

als das rs.movelast hat jetzt zumindest nicht spürbar was verändert.

Wie kann ich den recordset offen halten?

Ich hab die Funktion zum schreiben des Logs in einem Modul abgelegt, das aus verschiedenen Formularen aufgerufen.

mfg
n4426

EDIT: oder ist es vieleicht besser, für das Log einfach nur ein SQL-Comand (INSERT ....) zu schreiben?
Bitte warten ..
Mitglied: n4426
20.07.2011 um 21:23 Uhr
habs jetzt über DoCmd.RunSQL("Insert ....") gemacht, das läuft super schnell.

mfg
n4426
Bitte warten ..
Mitglied: NetWolf
21.07.2011 um 01:14 Uhr
*vordenkopfschlag*

logisch, klar ist das schneller als vorher einen Dynaset zu erzeugen.

Grüße aus Rostock
Wolfgang
(Netwolf)
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows 10
"geräte und drucker" unter w8 bzw. w10 zu starten dauert ewig (5)

Frage von tobias3355 zum Thema Windows 10 ...

Windows Netzwerk
gelöst Bootvorgang mit fester iPv4 dauert ewig (13)

Frage von BERGER-IT zum Thema Windows Netzwerk ...

VB for Applications
gelöst VBA Excel Recordset - Abfrage auf SQL-Server (4)

Frage von Aximand zum Thema VB for Applications ...

Datenbanken
gelöst Datensatz hinzufügen, nicht überschreiben Access (19)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...