AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Geschwindigkeit Datenbankzugriff (MS Access)
Thema durchsuchen
Ansicht
Themen-Optionen

Geschwindigkeit Datenbankzugriff (MS Access)

Ein Thema von xcs · begonnen am 31. Mär 2008 · letzter Beitrag vom 31. Mär 2008
Antwort Antwort
xcs

Registriert seit: 31. Mär 2008
14 Beiträge
 
#1

Geschwindigkeit Datenbankzugriff (MS Access)

  Alt 31. Mär 2008, 13:04
Datenbank: MS Access • Version: 2003 • Zugriff über: ODBC
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Geschwindigkeit Datenbankzugriff (MS Access)

  Alt 31. Mär 2008, 13:07
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;
Markus Kinzler
  Mit Zitat antworten Zitat
xcs

Registriert seit: 31. Mär 2008
14 Beiträge
 
#3

Re: Geschwindigkeit Datenbankzugriff (MS Access)

  Alt 31. Mär 2008, 14:09
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?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Geschwindigkeit Datenbankzugriff (MS Access)

  Alt 31. Mär 2008, 14:14
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 Query.ExecSQL sondern als 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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Geschwindigkeit Datenbankzugriff (MS Access)

  Alt 31. Mär 2008, 14:15
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 (...);
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Geschwindigkeit Datenbankzugriff (MS Access)

  Alt 31. Mär 2008, 14:20
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.
  Mit Zitat antworten Zitat
xcs

Registriert seit: 31. Mär 2008
14 Beiträge
 
#7

Re: Geschwindigkeit Datenbankzugriff (MS Access)

  Alt 31. Mär 2008, 17:21
Danke Jelly.
Mit MS SQL Server 2005 ist alles kein Problem mehr!!!
Wahnsinn, der Unterschied!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 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