![]() |
Datenbank: MS Access • Version: 2003 • Zugriff über: ODBC
Geschwindigkeit Datenbankzugriff (MS Access)
Hallo, ich möchte per SQLQuery (ExecSQL) eine Tabelle einer Access-Datenbank füllen und frage mich, ob sich das ganze irgendwie beschleunigen lässt oder ob Access zu langsam ist oder ob es prinzipiell nicht schneller geht:
Ich habe eine sehr große Datenmenge (250.000 - 1.000.000 Datensätze zu jeweils 120 Feldern). Mein Vorgehen ist wie folgt:
Delphi-Quellcode:
Dabei dauert ein Schleifendurchlauf ca. 30-40 ms. Heißt also, bei 500.000 Datensätzen schon über 4 Stunden!
for i := 0 to 500000 do
begin strSQL := 'Insert into Table1 (field1, field2, ..., field120) values (value1, value2, ..., value120)'; query1.SQL.Clear; query1.SQL.Add(strSQL); query1.ExecSQL end; Wenn ich die Daten einfach per Semikolon getrennt in eine Textdatei schreibe, dauert ein Durchlauf weniger als 1 ms. |
Re: Geschwindigkeit Datenbankzugriff (MS Access)
Arbeite mit (SQL-)Parametern:
Delphi-Quellcode:
strSQL := 'Insert into Table1 (field1, field2, ..., field120) values (:value1, :value2, ..., :value120)';
query1.SQL.Text := strSQL; query1.Prepare; for i := 0 to 500000 do begin query1.parambyname('value1').value := <Wert1>; ... query1.ExecSQL; end; |
Re: Geschwindigkeit Datenbankzugriff (MS Access)
Danke für die Antwort.
Habe jetzt die Params benutzt, aber es wird nicht schneller :( Wenn ich den Befehl execSQL auskommentiere, dauert eine Schleife 3,1 ms. D.h., die Ausführung des SQL-Befehls dauert fast 30 ms. Lässt sich das verbessern? (evtl. auch irgendwelche ODBC-Einstellungen o.ä., kenn mich damit leider nicht so gut aus) Oder muss ich es hinnehmen? |
Re: Geschwindigkeit Datenbankzugriff (MS Access)
Access kann das nicht schneller, es handelt sich ja um ein uralt-billig-Tabellenverwaltungsprogramm.
Als mögliche Performanceoptimierung kann es sein, du an Access z.B. jeweils 10 UPDATE-Befehle schickst, dann aber nicht per
Delphi-Quellcode:
sondern als
Query.ExecSQL
Delphi-Quellcode:
.
MyAdoConnection.Execute (CommandString)
Wenn Du Performance möchtest, besorg Dir ein richtiges DBMS, wie MSSQL, FB, MySQL etc. Für massiv viele Daten verwende ich BCP für MSSQL, ein Tool, das ca. 1000 Records pro Sekunde schafft. So ein richtiges DBMS verkraftet garantiert auch o.g. Trick mit dem Sammeln der Befehle. |
Re: Geschwindigkeit Datenbankzugriff (MS Access)
Warum schreibst Du nicht alle Insert-Anweisungen in eine SQL-Text-Anweisung und arbeitest diese ab?
SQL-Code:
INSERT INTO Table1 (Val1, Val2) VALUES ('Val1', 'Val2');
INSERT INTO Table1 (Val1, Val2) VALUES (...); |
Re: Geschwindigkeit Datenbankzugriff (MS Access)
Bei 500000 Records mit 120 Feldern (überleg dir auch da vielleicht mal dein DB Design) würd ich tunlichst die Finger von Access lassen und auf eine gescheitere und performantere DB umsteigen. Wegen Access bietet sich hier der MSSQL Server 2005 an. Damit sind dann auch BulkInserts möglich, die um ein Vielfaches schneller sind.
|
Re: Geschwindigkeit Datenbankzugriff (MS Access)
Danke Jelly.
Mit MS SQL Server 2005 ist alles kein Problem mehr!!! Wahnsinn, der Unterschied! ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz