Performance-Optimierung: DAO versus SQL

Werbung
Performance-Optimierung: DAO versus SQL
http://www.helma-spona.de
Performance-Optimierung: DAO versus
SQL
von Helma Spona
Große Datenmengen lassen sich mit Access auf vielfältige Weise bearbeiten. Die zwei am
häufigsten Verwendeten sind das DAO-Objekt-Modell und SQL. Darüber hinaus gibt es aber
auch noch die Möglichkeit, Abfragen auszuführen, um Daten zu manipulieren. Die Frage,
welches die schnellste Möglichkeit ist, werden viele Entwickler prompt mit "SQL" beantworten.
Aber ist das wirklich in jedem Fall so?
ist somit über 33% langsamer. Auch wenn
Sie
eine
Tabellenerstellungsabfrage
verwenden, die die gleiche SQLAnweisung verwendet, wie sie beim Test
mit SQL verwendet wurde, ergibt sich
noch eine Zeitdifferenz von drei Sekunden
gegenüber SQL.
Info
Betrifft:
Access, Datenbanken, SQL,
Datenabfragen, Datenmanipulation
Systemanforderungen:
Access 97 und
höher
Seitenzahl: 4
Die Frage nach der schnellsten Methode
zur Datenmanipulation ist nicht so leicht
zu beantworten, wie es auf den ersten
Blick scheint. Nicht immer entspricht das
Ergebnis nämlich den Erwartungen. Zu
erwarten wäre beispielsweise, dass die
Nutzung von Aktionsabfragen oder SQLAnweisungen gleich schnell ist, da in
beiden Fällen von Access die gleiche SQLAnweisung ausgeführt wird. Dennoch ist
dies nur beim Ändern vorhandener
Datensätze der Fall. Ganz anders sieht es
beim Erzeugen und Löschen von Tabellen
und beim Löschen und Einfügen der
Datensätze aus.
Bild 1: Geschwindigkeitsvergleiche beim Erstellen und
Löschen von Tabellen
Wenn Sie in eine Tabelle, die aus drei
Feldern, einem numerischen, einem
Textfeld und einem Memo-Feld besteht,
10.000 Datensätze einfügen, ergibt sich ein
ganz anderes Bild. Hier ist SQL mit
Abstand am langsamsten. Mit einer SQLAnweisung benötigen Sie nämlich 38
Sekunden, während DAO hier mit 31
Sekunden
auskommt
und
eine
Anfügeabfrage, die 10.000 Mal aufgerufen
wird, immer noch mit 30 Sekunden
auskommt.
PERFORMANCE VERGLEICHEN
Am besten lässt sich die Geschwindigkeit
der einzelnen Methoden vergleichen, wenn
Sie mehrmals hintereinander die gleiche
Aktion durchführen und die dazu
notwendige Zeit messen und berechnen.
Dabei hat sich ergeben, dass vor allem
beim Erstellen von Tabellen SQL die Nase
vorn hat. Um 1000 mal eine Tabelle zu
erstellen und wieder zu löschen, werden
mit Hilfe von SQL nur 9 Sekunden, bei
Nutzung der CreateTableDef-Methode
jedoch ganz 15 Sekunden benötigt. DAO
1
Performance-Optimierung: DAO versus SQL
http://www.helma-spona.de
Aktion
Tabellen
erstellen
und
löschen
1000 x
Datensätze
einfügen
10.000 Stk.
Datensätze
ändern
(20.000)
Datensätze
abhängig
von einer
Bedingung
ändern
(20.000)
Datensätze
löschen
(20.000)
Bild 2: Am schnellsten lassen sich Datensätze mit DAO
erzeugen
Wenn Sie vorhandene Datensätze ändern
möchten, werden Sie dabei feststellen,
dass hier SQL und Aktionsabfragen gleich
schnell sind und DAO am langsamsten.
Das lässt sich allerdings dadurch erklären,
dass Sie mit DAO alle Datensätze
durchlaufen und einzeln ändern müssen,
während das mit SQL und somit auch in
Aktionsabfragen mit einer einzigen SQLAnweisung für alle Datensätze möglich ist.
Das gleiche Ergebnis ergibt sich, wenn Sie
nur bestimmte Datensätze abhängig von
einem Kriterium ändern möchten.
Allerdings wäre hier zu erwarten, dass das
länger dauert als ohne Kriterium. Dem ist
aber nicht so. Die Geschwindigkeit ist
zumindest bei 20.000 Datensätzen noch
gleich.
SQL
9
DAO
15
Abfragen
12
38
31
30
1
2
1
1
2
1
2
0
1
Tabelle 1: Übersicht über den Zeitbedarf für definierte
Aktionen
WIE WURDE GETESTET?
Jeder Performance-Test ist natürlich
relativ. Er ist nicht nur abhängig von der
Hardware auf der getestet wurde, sondern
auch vom Betriebssystem, der AccessVersion und dem Code, der zum Testen
verwendet wurde.
Für die vorstehenden Vergleiche wurde ein
Rechner mit Intel Pentium III Mobile mit
500 Mhz verwendet. Als Betriebssystem
wurde Windows XP Service Pack 1
eingesetzt und der Code wurde unter
Access 2002 ausgeführt.
Wichtig ist aber natürlich auch, welcher
Code für die Zeitmessung und die
Ausführung der SQL-Anweisungen und
Abfragen eingesetzt wurde. Listing 1 zeigt
die Prozedur für die Zeitmessung. An diese
Prozedur werden Anfangszeit und aktuelle
Zeit als Parameter übergeben. Prozedur
berechnet die Differenz und gibt die Zeit
im Testfenster aus.
Bild 3: Performance der verschiedenen Methoden beim
Ändern und Löschen von Datensätzen
Wenn Sie allerdings mit der gleichen VBASchleife alle Datensätze nacheinander
löschen, gibt es die nächste Überraschung.
Bei 20.000 Datensätzen brauchen Sie mit
DAO dazu weniger als eine Sekunde, mit
SQL hingegen zwei Sekunden und eine
Löschabfrage braucht immer noch eine
Sekunde dafür. Hier ist DAO also am
schnellsten.
Diese Prozedur wird dann in einer
weiteren Prozedur aufgerufen, die in einer
Schleife, die von 1 bis zu einem per
2
Performance-Optimierung: DAO versus SQL
http://www.helma-spona.de
Variablen definierten Endwert läuft, die
Testprozeduren aufruft. Am Ende der
Schleife wird die Prozedur Zeitmessung
aufgerufen. Nach der Ausgabe der Zeit,
wird die gleiche Schleife für eine andere
Prozedur ausgeführt, die dann eine andere
Methode bspw. DAO verwendet.
Anweisung, sondern den Namen der
auszuführenden Abfrage. Analog werden
auch die SQL-Anweisungen bzw. die
Abfragen zum Löschen und Erstellen der
Daten definiert. Da beide Prozeduren sich
so ähnlich sind, ist es natürlich um so
verwunderlicher,
dass
es
solche
erheblichen Unterschiede beim Einfügen
von Datensätzen gibt.
Listing 1: Die Zeitmessung
Sub Zeitmessung(datAnf As Date, datEnde As
Date)
Listing 2: SQL-Anweisungen und
Abfragen ausführen
Dim datZeit As Date
Sub DatenAendernSQL()
datZeit = datEnde - datAnf
Const strSQL = "UPDATE test SET test.ID =
2, test.Zeichen = ""XYZ"""
Debug.Print "Zeit: " & Format(datZeit, "")
End Sub
Dim objDB As DAO.Database
Set objDB = Application.CurrentDb
Sub testTabellen()
objDB.Execute strSQL
Dim datAnfang As Date
Set objDB = Nothing
Dim lngAnz As Long
End Sub
lngAnz = 1000
'SQL
Sub DatenAendernAbfrage()
Debug.Print "SQL"
Dim objDB As DAO.Database
datAnfang = Now
Set objDB = Application.CurrentDb
For lngI = 1 To lngAnz
objDB.Execute "DatAendern"
TabelleErstellenSQL
Set objDB = Nothing
TabelleLoeschenSQL
End Sub
Next lngI
Zeitmessung datAnfang, Now
Sub DatenAendernDAO()
Dim objDB As DAO.Database
...
Dim objRS As DAO.Recordset
End Sub
Set objDB = Application.CurrentDb
Set objRS = objDB.OpenRecordset("test3")
SQL-ANWEISUNGEN UND
ABFRAGEN AUSFÜHREN
objRS.MoveFirst
Do While objRS.EOF = False
Wie die SQL-Anweisungen und Abfragen
ausgeführt werden, spielt natürlich auch
eine Rolle. Listing 2 zeigt beispielhaft zwei
Prozeduren zum Ändern der Datensätze.
Die
Prozedur
DatenAendernSQL
verwendet
dazu
eine
UPDATEAnweisung, die über die Execute-Methode
des Database-Objekts ausgeführt wird.
Auf gleiche Weise verfährt die Prozedur
DatenAendernAbfrage. Sie übergibt an die
Execute-Methode aber keine SQL-
objRS.Edit
objRS.Fields("ID") = 2
objRS.Fields("Zeichen") = "XYZ"
objRS.Fields("langerText") = _
"Text im Memofeld"
objRS.Update
objRS.MoveNext
Loop
3
Performance-Optimierung: DAO versus SQL
http://www.helma-spona.de
objRS.Close
Set objRS = Nothing
Set objDB = Nothing
End Sub
Die Prozedur DatenAendernDAO öffnet
die Tabelle als Recordset-Objekt und
durchläuft die einzelnen Datensätze in
einer While-Schleife. Obwohl der Code
daher wesentlich aufwändiger aussieht, ist
die Zeitdifferenz verhältnismäßig gering.
FAZIT
Wenn Sie Datenzugriffe und Anweisungen
zur Datenbankmanipulation hinsichtlich
Performance optimieren möchten, sollten
Sie SQL-Anweisungen verwenden, wenn
Sie Tabellen erstellen, manipulieren und
löschen möchten. Zum Einfügen von
Datensätzen
sind
hingegen
Aktionsabfragen optimal. Wo dies nicht
möglich ist, weil komplexe Berechnungen
erforderlich sind, die nicht mit SQL zu
bewältigen ist, stellt DAO eine Alternative
dar. Zum Ändern von Datensätzen sollten
Sie wahlweise SQL oder Aktionsabfragen
einsetzen, zum Löschen hingegen wieder
DAO. <HS>
Rechtliche Rahmenbedingungen
Alle Inhalte wurden nach bestem Wissen und
Gewissen zusammengestellt. Ich übernehme für
Fehlerfreiheit allerdings keine Gewähr und hafte
keinesfalls für Folgen, die sich aus Fehlern oder
unsachgemäßem Gebrauch des Codes und der
Inhalte ergeben.
Code und Beispiele dürfen für den privaten
Gebrauch frei verwendet werden. Eine
Veröffentlichung (auch auszugsweise) sowohl
online wie auch auf klassischen Medien ist nur
nach meiner ausdrücklichen Zustimmung möglich.
Verlinkung der Artikel ist jedoch erlaubt und
erwünscht, solange immer auf die Webseite und
nicht die PDF-Datei verlinkt wird.
4
Herunterladen