Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit Datensatz Import (https://www.delphipraxis.net/141519-problem-mit-datensatz-import.html)

Live5 10. Okt 2009 15:11

Datenbank: Sybase • Version: 7 • Zugriff über: NativeDB

Problem mit Datensatz Import
 
Hallo Leute,

Also ich habe das Problem das ca. 300.000 Datensätze in 1 Stunde Importieren sein sollten.

Die Datenbank Läuft Lokal auf meinem Pc und ich verwende keine Indizies.

Ich verwende die Komponente "NativeDB" und zum Verbinden "TAsaSqlQuery" um alles zu Beschleunigen habe ich
den Cursor Typ auf "actFixedScroll" gestellt.

Ich teile derezeit zb. 20.000 Datensätze auf 5 Threads auf.
Die Threads tragen die die Daten dann in die Datenbank gleichzeitig ein und dafür benötige ich ca. 30 Minuten.

Damit ich 300.000 Datensätze in 1 Stunde schaffe müsste ich im gesammten ca. 40 Threads verwenden jedoch währe die zu Verwalten ein enormer aufwand.

Ich währe für die Hilfe echt dankbar :wink:

cu
live5

haentschman 10. Okt 2009 15:37

Re: Problem mit Datensatz Import
 
Hallo,

Zitat:

Also ich habe das Problem das ca. 300.000 Datensätze in 1 Stunde Importieren sein sollten.
erkläre das mal ein wenig genauer, Datenimport von wo nach wo, Datenformat der Quelle etc.
dann können wir besser helfen.

:hi:

edit: selbst ohne Thread´s sollte das eigentlich kein Problem sein. :gruebel:

uppps... Wilkommen in der DP :dp:

Live5 10. Okt 2009 15:54

Re: Problem mit Datensatz Import
 
Es geht um Datanorm5 Daten

eine zeile ist so aufgebaut.:

A;N;Artikelnummer;Text1;Text2;1;50;50000

Und solche 300.000 Artikel sind in ernem Textdatei vorhanden.
Bei den Artikeln werden noch berechneungen vom Preis durchgeführt bevor sie in die Datenbank eingetragen wird.

Ich Lese die Dateie ein unbearbeite diese dann Zeile für Zeile und speicher die daten dann in die Datenbank.

:freak:

haentschman 10. Okt 2009 15:58

Re: Problem mit Datensatz Import
 
hmmm...

laut Adam Riese und Eva Zwerg wären das 12 ms je Datensatz. Das wird mit Text parsen und eintragen schon knapp. Laß uns mal ein wenig Zeit zum überlegen :zwinker:

Edit: wie sieht den Dein Code zum Parsen der Datei aus ? Ich würde da ansetzen, da das die meiste Zeit verbraucht.

Live5 10. Okt 2009 16:20

Re: Problem mit Datensatz Import
 
Danke mal im Voraus.

Ich lese eine Zeile ein Teile diese bei jedem ";"

Danach erfolgen die Berechnungen und per Sql Query wird dann alles in die Datenbank eingetragen.

Am meisten zeit benötige ich beim Sql Query deshalb habe ich auch mehrere Abfragen zu einer Großen gemacht damit
alles etwas schneller wurde.

haentschman 10. Okt 2009 16:32

Re: Problem mit Datensatz Import
 
ich habe grad nochmal bei einem Projekt von mir geschaut. Da hatte ich 23 Textdateien einzulesen wo unter dem Strich 45000 Datensätze in der DB landeten. Die Zeilenanzahl in der Textdatei war höher, da der Text "Gruppiert" war. Der Import dauerte grad mal 2 Minuten. Hochgerechnet läßt du irgendwo ne Menge Zeit liegen. Das können wir nur gemeinsam finden, wenn du uns einen Einblick in den Quelltext gewährst :zwinker:

PS: ich arbeite mit Firebird. Liegen da die Unterschiede :gruebel:

wie oft mußt du diesen Import machen ?

edit: gelogen... :oops: sind nur 15000 DS in der DB in 2 Minuten. würde aber trotzdem reichen.

Live5 10. Okt 2009 17:14

Re: Problem mit Datensatz Import
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok Danke !

Ich poste mal die Dateien für den Import.

haentschman 10. Okt 2009 19:03

Re: Problem mit Datensatz Import
 
Ok...ohne das du mich festnagelst. Ich hab weniger Zeit als du gehabt mich damit zu beschäftigen. :zwinker:

folgende Dinge sind mir aufgefallen:

ich denke, daß die meiste Zeit in der AddToDB liegen bleibt.

- du erzeugst für jeden neuen Datensatz eine eigene GUID, könnte das von der DB selbst über einen Generator und Trigger erfolgen ?
- du liest die komplette AsaSQLQuery ein um sie dann nach Feldänderungen mit Append zu schreiben. Für die Überprüfung ob vorhanden reicht ein select count auf die entsprechenden Felder.
- das Schreiben würde ich mit insert into machen und die Werte als Parameter zur Verfügung stellen.
- Ich verstehe nicht, was die Sachen mit dem richViewHelper in der AddToDB für einen Sinn haben. Diese werden mit jeder Zeile mit ausgeführt.
(frmMain.TFrmDatanormImport.richViewHelper.Lines.S aveToStream(strStream);)
- Änderungen an den Artikeln mit SQL update statt Modify. Je nach Einstellung der Query werden viel zu viel Überprüfungen durchgeführt.

für den Anfang schon mal ein paar Anregungen. :wink:

Luckie 10. Okt 2009 19:09

Re: Problem mit Datensatz Import
 
Threads dürften nicht helfen, da die Threads synchronisiert werden müssen. Denn es kann immer nur ein Thread in die Datenbank schreiben.

alzaimar 10. Okt 2009 22:05

Re: Problem mit Datensatz Import
 
Zitat:

Zitat von haentschman
folgende Dinge sind mir aufgefallen:
...
- du liest die komplette AsaSQLQuery ein um sie dann nach Feldänderungen mit Append zu schreiben. Für die Überprüfung ob vorhanden reicht ein select count auf die entsprechenden Felder.

Um Gottes willen...
1. Erstell einen Index auf COL_ArtikelNummer.
2. Frage nicht auf 'LIKE' ab.
3. Zum prüfen, ob der Artikel schon existiert reicht ein
SQL-Code:
SELECT COL_ArtikelNummer From <Tabelle>
 WHERE COL_ArtikelNummer='BlaBla'
   AND COL_DataNormLieferant like '%FooBar%' -- <<--- So ein Quark
Ohne Index dauert diese Prüfung immer länger.

4. Lerne etwas über 3NF (Außer, die DB-Struktur darf nicht verändert werden. Egal, lerne trotzdem)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr.
Seite 1 von 2  1 2      

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