Performance: Wie kann ich die Leistung meiner Access-Datenbank verbessern?

1. Tabellenstruktur prüfen

  • Felder nur, wenn sie wirklich gebraucht werden
  • Keine unnötigen Memo-Felder (Langtext)
  • Felddatentypen korrekt wählen (kein „Text“ für Zahlen)
  • Primärschlüssel setzen – immer

Beispiel:

ALTER TABLE tblAufträge ADD CONSTRAINT pk_Auftrag PRIMARY KEY (ID);

2. Indizes sinnvoll nutzen

  • Indizes auf Felder, nach denen häufig gefiltert oder sortiert wird
  • Kombi-Indizes für komplexe WHERE-Bedingungen
  • Keine Indizes auf Felder mit wenigen eindeutigen Werten (z. B. Status)

Beispiel:

CREATE INDEX ix_KundeDatum ON tblAufträge (KundenID, Auftragsdatum);

3. Abfragen optimieren

  • Kein SELECT *, sondern nur benötigte Felder
  • WHERE-Klauseln konkret halten
  • TOP, WHERE, IN nutzen statt Nachladen in Formularen

Beispiel:

SELECT TOP 100 ID, Kundenname FROM tblKunden WHERE Aktiv=True ORDER BY ErfasstAm DESC;

4. Formulare gezielt laden

  • Nur anzeigen, was wirklich gebraucht wird
  • Unterformulare filtern – nicht alles pauschal laden
  • Tab-Steuerelemente verzögert laden (OnChange)

Beispiel:

Private Sub tabSteuerung_Change()
    If Me.tabSteuerung.Value = 1 Then
        Me.sfAufträge.Form.RecordSource = "SELECT * FROM tblAufträge WHERE KundenID=" & Me!KundenID
    End If
End Sub

5. Recordsets bewusst öffnen

  • Nur DAO, kein Mix mit ADO
  • dbOpenSnapshot für lesende Abfragen
  • Immer Set rs = Nothing und rs.Close

Beispiel:

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT Name FROM tblKunden", dbOpenSnapshot)

' Verarbeitung hier

rs.Close
Set rs = Nothing

6. Frontend und Backend trennen

  • Immer aufteilen in .accde (Frontend) und .accdb (Backend)
  • Tabellenverknüpfung lokal cachen – mit TableDef.Connect

Verbindung bei Start prüfen:

If Dir(CurrentProject.Path & "\Backend.accdb") = "" Then
    MsgBox "Backend nicht gefunden."
End
End If

7. Netzwerkzugriffe minimieren

  • Nur kleine Datensätze über das Netz
  • Keine großen Abfragen auf riesige Tabellen ohne Filter
  • Temp-Tabellen lokal im Frontend verwenden, nicht im Backend

Beispiel:

DoCmd.TransferDatabase acImport, "Microsoft Access", BackendPfad, acTable, "tblExport", "tmpExport"

8. Komprimierung und Reparatur automatisieren

  • Access-Dateien blähen sich auf
  • Regelmäßig komprimieren – idealerweise täglich nach Dienstschluss

Beispiel mit JRO:

Dim j As Object
Set j = CreateObject("JRO.JetEngine")
j.CompactDatabase "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DB\Alt.accdb", _
                  "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DB\Neu.accdb"

9. Temporäre Tabellen statt Abfragen

  • Komplexe Daten vorbereiten in tmp_-Tabellen
  • Dann Formular auf Tabelle binden statt verschachtelter Abfrage
CurrentDb.Execute "SELECT * INTO tmp_Monatsdaten FROM qryMonatsdaten", dbFailOnError

10. VBA-Code gezielt optimieren

  • Schleifen reduzieren
  • Rechenintensive Vorgänge vermeiden
  • Array-Puffer statt Recordsets bei Massenoperationen

Beispiel:

Dim arr() As Variant
arr = CurrentDb.OpenRecordset("SELECT ID, Wert FROM tblDaten", dbOpenSnapshot).GetRows

' Array durchlaufen statt Recordset.MoveNext

11. Logging abschalten im Produktivbetrieb

  • Debug.Print raus
  • MsgBox raus
  • Nur Logging, wenn explizit aktiviert (z. B. blnDebug=True)

12. Frontend regelmäßig aktualisieren

  • Lokale .accde auf dem Client
  • Auto-Update-Skript per Batch oder VBA beim Start
  • Kein Arbeiten direkt aus Netzlaufwerken

Beispiel:

If FileDateTime(ServerVersion) > FileDateTime(LocalVersion) Then
    ' Kopieren und Neustart erzwingen
End If
Nach oben scrollen