Wenn Access plötzlich lahmt
Kennst Du das?
Die Access-Datenbank läuft seit Jahren.
Und plötzlich dauert alles ewig.
Formulare brauchen Sekunden.
Dateigröße: 600 MB. Inhalt: ein paar Tabellen.
Access altert.
Nicht im Code. In der Datei selbst.
Warum wird Access langsamer?
Drei Hauptgründe:
- Dateibloat
Access gibt Speicherplatz nicht automatisch frei.
Gelöschte Datensätze, Designänderungen, temporäre Objekte – alles bleibt als „Ballast“ in der Datei. - Fragmentierung von Objekten
Je öfter Du Formulare, Module, Tabellen speicherst, desto mehr Fragmente entstehen.
Access muss beim Start alles zusammensetzen. - Verknüpfte Tabellen auf langsamen Netzwerken
Jeder Zugriff über LAN ist potenziell träge.
Besonders bei großen Tabellen ohne Filter.
Meine Sofortmaßnahmen
1. Komprimieren & reparieren (manuell oder automatisch)
Komprimieren leert den Müll.
Reparieren räumt auf.
In VBA:
Public Sub KomprimiereDatenbank()
Dim strQuelle As String
Dim strZiel As String
strQuelle = CurrentDb.Name
strZiel = Replace(strQuelle, ".accdb", "_komp.accdb")
DBEngine.CompactDatabase strQuelle, strZiel
MsgBox "Fertig. Neue Datei: " & strZiel
End Sub
Oder im Menü:
Datei → Optionen → Aktuelle Datenbank → Beim Schließen komprimieren
Hilft fast immer.
2. Temporäre Tabellen löschen
Ich räume regelmäßig auf:
Public Sub TempTabellenLöschen()
Dim tdf As DAO.TableDef
For Each tdf In CurrentDb.TableDefs
If Left(tdf.Name, "tmp") = "tmp" Then
DoCmd.DeleteObject acTable, tdf.Name
End If
Next
End Sub
Viele vergessen, dass Make-Table Queries
die Datei aufblähen.
3. Formulare entladen statt offen lassen
Formulare mit vielen Steuerelementen verbrauchen RAM.
Ich schließe nicht sichtbare Formulare per VBA:
Public Sub FormulareEntladen()
Dim frm As Form
For Each frm In Forms
If frm.Visible = False Then DoCmd.Close acForm, frm.Name
Next
End Sub
Weniger Formulare = weniger RAM = schneller.
4. Module kompilieren
Unkompilierter Code macht Access träger.
Public Sub KompiliereAlleModule()
Application.SetOption "Compile On Demand", False
DoCmd.RunCommand acCmdCompileAndSaveAllModules
End Sub
Danach am besten einmal schließen und wieder öffnen.
Was ich langfristig tue
Tabellen auslagern (Split Database)
Backend: Daten.accdb
Frontend: App.accdb
Trennt Daten und Logik.
Weniger Konflikte. Bessere Wartung.
Und Du kannst das Frontend regelmäßig frisch verteilen.
Indexe prüfen
Fehlende oder veraltete Indexe bremsen brutal.
Public Sub IndexePrüfen(tabellenname As String)
Dim tdf As DAO.TableDef
Dim idx As DAO.Index
Set tdf = CurrentDb.TableDefs(tabellenname)
For Each idx In tdf.Indexes
Debug.Print idx.Name, idx.Fields
Next
End Sub
Fehlt der Index auf einem JOIN-Feld? Dann dauert’s.
Immer prüfen.
Netzwerkprobleme erkennen
Wenn verknüpfte Tabellen langsam reagieren:
Liegt meist am Netzlaufwerk.
Workaround: ODBC-Verknüpfung statt Dateifreigabe.
Oder gleich SQL Server Express. Kostet nix. Bringt viel.
Monitoring per Code
Ich logge Ladezeiten mit:
Public Sub LadezeitMessen()
Dim t1 As Single, t2 As Single
t1 = Timer
DoCmd.OpenForm "frmRechnung"
t2 = Timer
Debug.Print "Ladezeit: " & Format(t2 - t1, "0.00") & " Sekunden"
End Sub
Wenn’s über 2 Sekunden geht: analysieren.
Aufräumen statt neu bauen.
Access wird nicht von selbst schneller.
Aber Du kannst viel tun:
- Komprimieren
- Formulare und Module pflegen
- Indexe setzen
- temporäre Objekte regelmäßig löschen
Ich mach das regelmäßig.
Weil eine schnelle Access-DB besser ist als jede Neuentwicklung.
Keine Antworten