Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi 10.000 Datensätze ganz schnell einfügen (https://www.delphipraxis.net/25772-10-000-datensaetze-ganz-schnell-einfuegen.html)

tuxic 12. Jul 2004 11:28


10.000 Datensätze ganz schnell einfügen
 
Hi,
ich habe das Problem das ich gaaaaaaaaaaaaaaaaaaanz schnell mindestens(!) 10.000 Datensätze in eine Paradox über die BDE eintragen muss.
Das ganze ist in sofern einfach, weil sich eigentlich nur ein Feld immer verändert (mit einer laufenden Nummer). Dieses Feld ist aber ein Textfeld, und _kein_ AutoInc.
Im moment füge ich die Datensätze via for-Schleife ein, das dauert aber trotzdem ein wenig.
Hat irgendwer einen Optimierungsvorschlag?

MfG
Daniel

mytar 12. Jul 2004 11:31

Re: 10.000 Datensätze ganz schnell einfügen
 
Das Problem hatte ich auch mal

Das ist zwar schon länger her, aber bei irgend einer komponente die du hast

gibt es ControlsDisabled oder ControlsEnabled.

Disable die Controls vor dem Einfügen und Enable sie dann wieder.


Schau einfach mal genau nach, funktionieren tut es sicher!

mytar

phlux 12. Jul 2004 11:32

Re: 10.000 Datensätze ganz schnell einfügen
 
Ich kenn mich nicht so gut aus mit datenbanken, aber wie wärs wenn du die daten erst in einen array schreibst und dann den array als blob oder etwas anderes stream ähnliches in die db haust?

Robert_G 12. Jul 2004 11:44

Re: 10.000 Datensätze ganz schnell einfügen
 
@phlux
Bei einer "richtigen" DB würdest _fast_ richtig liegen, dort löst man das über Bulk DML (auch Array DML gennant :zwinker: )

Bei diesem BDE-Zeugs gibt's IMHO so etwas wie BatchMove (habe ich hier irgendwo mal gelesen :roll: ).

phlux 12. Jul 2004 11:48

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

Zitat von Robert_G
@phlux
Bei einer "richtigen" DB würdest _fast_ richtig liegen, dort löst man das über Bulk DML (auch Array DML gennant :zwinker: )

Bei diesem BDE-Zeugs gibt's IMHO so etwas wie BatchMove (habe ich hier irgendwo mal gelesen :roll: ).

Dann bin ich ja beruhigt, dass der Schuss ins Blaue geglückt ist :mrgreen:

tuxic 12. Jul 2004 12:38

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

Zitat von mytar
Das Problem hatte ich auch mal

Das ist zwar schon länger her, aber bei irgend einer komponente die du hast

gibt es ControlsDisabled oder ControlsEnabled.

Disable die Controls vor dem Einfügen und Enable sie dann wieder.


Schau einfach mal genau nach, funktionieren tut es sicher!

mytar

hey, guter Tipp. Anscheinend schreibt er den Index erst am Ende der INSERT's neu. Wobei das immernoch nen bischen langsam ist :D - aber viel schneller als vorher ;)

Daniel

mytar 12. Jul 2004 15:13

Re: 10.000 Datensätze ganz schnell einfügen
 
Ich hab da einfach ein Sanduhr als MouseStyle gesetzt.


D.h.

setze vor dem einfügen

Delphi-Quellcode:
CursorStyle := csHourGlass;
nach dem einfügen

Delphi-Quellcode:
CursorSytel := csDefault;

Such einfach mal in der OH nach CursorStyle oder csHourGlass;

Ich glaub im Form müsste es

Delphi-Quellcode:
Self.CursorStyle
sein

dann weis der User, aha jetzt passiert was.

ich hoffe es hilft dir

tuxic 12. Jul 2004 19:01

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

Zitat von mytar
Ich hab da einfach ein Sanduhr als MouseStyle gesetzt.

hehe, ich hab einfach eine Form, auf der ein Zähler immer weiterzählt, dann weiß der User auch, nach wievielen Stunden er seine Mittagspause beenden muss :D

Aber das mit dem Batchmove werde ich mir mal angugn ;)

Daniel

Chris1986 12. Jul 2004 19:12

Re: 10.000 Datensätze ganz schnell einfügen
 
Gibst du jeden der 10.000 Schleifendurchläufe optisch aus? Dann ist es klar, dass das länger dauert. :lol: Nimm das mal raus, dann sollte es schon VIEL schneller gehen

MrSpock 12. Jul 2004 19:14

Re: 10.000 Datensätze ganz schnell einfügen
 
Batchmove ist aber eine gute Empfehlung. Geht schnell und ist einfach zu benutzen.

Sharky 12. Jul 2004 20:46

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

Zitat von mytar
Ich hab da einfach ein Sanduhr als MouseStyle gesetzt....

Hai mytar,
das ist ja schön und gut. Aber was hat das mir der Frage zu tun?

tuxic 13. Jul 2004 09:25

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

Zitat von Chris1986
Gibst du jeden der 10.000 Schleifendurchläufe optisch aus? Dann ist es klar, dass das länger dauert. :lol: Nimm das mal raus, dann sollte es schon VIEL schneller gehen

rofl - sicher braucht er am ende 5sec länger, aber das macht bei ca. 10min dann auch nix mehr ;)

Daniel

Maa83 13. Jul 2004 10:23

Re: 10.000 Datensätze ganz schnell einfügen
 
nein er braucht nicht nur 5 Sekunden länger sondern um einiges länger...
ich hab das auch mal mit einem Zähler mitlaufen lassen... habs aber schnell wieder rausgenommen weil das ohne Ende Performance frisst!

grayfox 13. Jul 2004 13:18

Re: 10.000 Datensätze ganz schnell einfügen
 
hallo maa!

du kannst ja auch bei deinem zähler festlegen, dass er zb nur bei jeden hundertsten datensatz die anzeige aktualisiert - dann beschäftigt sich das prog wieder mehr mit dem einlesen als mit dem anzeigen.

mfg, stefan

Maa83 13. Jul 2004 13:26

Re: 10.000 Datensätze ganz schnell einfügen
 
I know...

aber ich nehm lieber einen "bitte warten" Bildschirm :)

@tuxic: Wie schreibst du die Datensätze eigentlich weg? Mit ner AdoQuery oder mit selbstgeschriebenen Dingen oder wie? Wie lautet dein SQL-Befehl...
Vielleicht kann man da ja was optimieren...

mfg
Maa

mytar 13. Jul 2004 15:06

Re: 10.000 Datensätze ganz schnell einfügen
 
@Chris1986: Ich denke ControlsEnabled macht das ja.

woki 13. Jul 2004 15:34

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

Zitat von mytar
@Chris1986: Ich denke ControlsEnabled macht das ja.

nein, dies aktiviert (deaktiviert) nur das visuelle updaten der von diesem Dataset abhängenden datensensitiven Controls, alle anderen Möglichkeiten zur Ausgabe sind davon nicht betroffen. Wenn ich also nach jedem Datensatz das Interface update (eine Info schreiben), dann frißt das mehr Zeit als alles andere, bezogen auf die meisten Probleme,die auf PC-Systemen bearbeitet werden.

Grüße
Woki

tuxic 13. Jul 2004 15:50

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

Zitat von Maa83
@tuxic: Wie schreibst du die Datensätze eigentlich weg? Mit ner AdoQuery oder mit selbstgeschriebenen Dingen oder wie? Wie lautet dein SQL-Befehl...
Vielleicht kann man da ja was optimieren...

UI, also ich schiebe erst einen Datensatz in ein Array einer Klasse, um dann zusagen Klasse.save2db (mal bildlich gesprochen :) ) .
Das einfügen passiert mit einem einfachen
SQL-Code:
INSERT INTO table (fields) VALUES (data)
Daniel

Maa83 13. Jul 2004 16:09

Re: 10.000 Datensätze ganz schnell einfügen
 
hast du schonmal versucht dir erst den kompletten insert string zu schreiben und ihn dann nur einmal ausführen?

also so:

Delphi-Quellcode:
for i := 0 to ende do begin
   sqlString := sqlString + ',INSERT INTO '+Tabelle+' VALUES ('+werte+')';
end;
Delete(sqlString,1,1);

adocom_tmp.CommandString := sqlString;
adocom_tmp.Execute;
also quasi die ganzen Inserts mit Komma getrennt auflisten und dann ausführen... müsste auch um einiges schneller gehen...

wenn du dann noch die grafische ausgabe komplett unterbindest müsste das unterhalb einer Minute durchlaufen!

(obiger Code nicht getestet... das heisst es könnten sich kleine Fehler eingeschlichen haben!)

Robert_G 13. Jul 2004 16:32

Re: 10.000 Datensätze ganz schnell einfügen
 
Zitat:

(obiger Code nicht getestet... das heisst es könnten sich kleine Fehler eingeschlichen haben!)
Jupp, er ist falsch!

Seit wann kannst du in SQL, kommagetrennt, Statements absetzen :?:

Nachdem ich diesen Thread etwas verfolgt habe, frage ich mich: Benutzt ihr INSERT/EDIT/Post des DataSet????

sowas hier...
Delphi-Quellcode:
...
  SomeTDataSetDescendant.Insert;
  //do something
  SomeTDataSetDescendant.Post;
... hat ABSOLUT nichts mit performantem Datenzugriff gemeinsam!

Nachdem es auch schon der Paradox-erfahrene Vulkanier gesagt hat, plädiere ich immer noch auf BatchMove!

Maa83 14. Jul 2004 07:27

Re: 10.000 Datensätze ganz schnell einfügen
 
ähm... ich will ja nix sagen aber erst mal testen bevor man was sagt...

SQL Statements KANN man mit , getrennt angeben... zumindest bei Inserts!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 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