Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Geschwindigkeit Datenbankzugriff (MS Access) (https://www.delphipraxis.net/111193-geschwindigkeit-datenbankzugriff-ms-access.html)

xcs 31. Mär 2008 12:04

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:
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;
Dabei dauert ein Schleifendurchlauf ca. 30-40 ms. Heißt also, bei 500.000 Datensätzen schon über 4 Stunden!
Wenn ich die Daten einfach per Semikolon getrennt in eine Textdatei schreibe, dauert ein Durchlauf weniger als 1 ms.

mkinzler 31. Mär 2008 12:07

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;

xcs 31. Mär 2008 13:09

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?

alzaimar 31. Mär 2008 13:14

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:
Query.ExecSQL
sondern als
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.

Kroko1999 31. Mär 2008 13:15

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 (...);

Jelly 31. Mär 2008 13:20

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.

xcs 31. Mär 2008 16:21

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 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz