Direkt zum Hauptbereich

Tipps zum Performance-Tuning im Netzwerk bei Share-Nutzung unter Microsoft Access

Hier drei Tipps, um den Zugriff auf MS Access-Datenbanken, die auf Netzlaufwerken (Shares) liegen, zu beschleunigen:

Tipp1: Kurze Dateinamen (8.3-DOS-Format) verwenden

Lange Dateinamen/Pfadnamen im Netz werden ab Windows XP aufwärts wohl nicht gecached, die kurzen Dateinamen (8.3-DOS-Format) schon. Dies kann sich stark bremsend auswirken. Abhilfe kann man hier durch die Verwendung der kurzen Dateinamen schaffen. Die Abbildung eines langen auf einen kurzen Pfadnamen lässt sich über einen Windows-API-Call bewerkstelligen, der von einer Konvertier-Funktion aufgerufen wird:

Declare Function GetShortPathName Lib "kernel32" _ Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _ ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long


Function GetShortName(ByVal sLongFileName As String) As String
   'Puffer für API-Rückgabewert
    Dim lRetVal As Long
    dim sShortPathName As String
    Dim iLen As Integer
    sShortPathName = Space(255)    iLen = Len(sShortPathName) 'Windows-API-Call    lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
    'Führende Leerzeichen entfernen
    GetShortName = Left(sShortPathName, lRetVal)
End Function

Bei Zugriffen auf Datenbanken im Netz, z. B. bei der Tabelleneinbindung mit 
DoCmd.TransferDatabase, übergibt man dann den Pfad zur Datenbank als GetShortName([Pfad]).

Tipp2: Permanent ein Recordset zur Datenbank im Netz offen halten

  • Man definiert eine Public-Variable als DAO-Datenbank-Objekt (z. B. Public AlwaysOpenDBConnection AS DAO.Database)
  • Bei der ersten Gelegenheit, nachdem die Datenbank im Netz eingebunden wurde, baut man eine Verbindung auf (Set AlwaysOpenDBConnection = OpenDatabase(Datenbankpfad$, False) )
  • Bei Programmende gibt man die Verbindung wieder frei (Set AlwaysOpenDBConnection = Nothing)

Der letzte Schritt scheint eigentlich unsinnig, da man erwartet, dass Access beim Beenden allen allozierten Speicher wieder frei gibt, doch dem scheint nicht so zu sein.

Tipp3: Änderungen in Blöcken schreiben lassen

Wenn viele Änderungen “am Stück” in eine Datenbank geschrieben werden sollen, kann man einen Transaktions-Block definieren. Die einzelnen Schreibanweisungen werden dann von der Jet-Engine gesammelt und gemeinsam ausgeführt. Dies beschleunigt den Zugriff. Beispiel:

BeginTrans For i=1 to 1000
    odb.Execute "INSERT INTO Zahlenliste VALUES('" & i & "')"
EndTrans


Inwiefern diese Tipps helfen, muss man jeweils im konkreten Fall testen.




#msaccess

Kommentare