Langsame Access-Datenbanken: Warum Access langsamer und größer wird und wie ich Performance wiederherstelle

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:

  1. Dateibloat
    Access gibt Speicherplatz nicht automatisch frei.
    Gelöschte Datensätze, Designänderungen, temporäre Objekte – alles bleibt als „Ballast“ in der Datei.
  2. Fragmentierung von Objekten
    Je öfter Du Formulare, Module, Tabellen speicherst, desto mehr Fragmente entstehen.
    Access muss beim Start alles zusammensetzen.
  3. 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.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert