Delphi-PRAXiS

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)

Der.Kaktus 10. Okt 2009 23:29

Re: Problem mit Datensatz Import
 
Also ich muss Statistik Router machen(150 Standorte)..pro Tag 1500 Datensaetze..nutze dafuer Absolute Database..Berechnung pro Standort dauert ca. 3 Minuten.

haentschman 11. Okt 2009 09:24

Re: Problem mit Datensatz Import
 
Guten Morgen... :hi:

Zitat:

Für die Überprüfung ob vorhanden reicht ein select count auf die entsprechenden Felder.
...um Gottes Willen, damit meinte ich nicht alle Felder sondern 1 (oder max 2) wie alzaimar schon bemerkte.

Live5 11. Okt 2009 11:59

Re: Problem mit Datensatz Import
 
Mahlzeit !

Dake für eure Hilfe bin grad mitn im Umbauen.

Also die Threads sind fürn Hugo viel arbeit für nichts leider....

Bei der Abfrage ob Artikel vorhanden benötige ich zwei Felder denn es wäre möglich das zwei Verschiedene Lieferentane
einen Artikel mit der gleichen Artikel Nummer haben :roll:

Hansa 11. Okt 2009 12:30

Re: Problem mit Datensatz Import
 
Dazu verknüpft man normalerweise die Art.Nr. mit der Lief.Nr. Somit wird sie dann eindeutig.

sx2008 11. Okt 2009 15:23

Re: Problem mit Datensatz Import
 
Zitat:

Zitat von haentschman
- das Schreiben würde ich mit insert into machen und die Werte als Parameter zur Verfügung stellen.

Das würde ich als Erstes versuchen.
Es bringt z.B. beim Einfügen in eine MS SQL Server DB ungefähr eine Beschleunigung um Faktor 5.
1,2 Mio Datensätze (7 Felder) werden so in ~ 25Min importiert.
Wenn man mit einem Insert gleich mehrere Datensätze einfügen kann, dann kann man noch
mehr rausholen.
SQL-Code:
INSERT INTO Tabelle(Feld1, Feld2) VALUES(WertA, WertB), VALUES(WertA2, WertB2),...
Leider beherrscht nicht jede Datenbank diese erweiterte Syntax.

Live5 11. Okt 2009 16:19

Re: Problem mit Datensatz Import
 
Danke habe bereits alles auf Update bzw. Insert Into umgebaut und Versuche jetzt mal den Praxis Test mit den 300.000 Datensätzen.
:shock:

Live5 11. Okt 2009 22:51

Re: Problem mit Datensatz Import
 
Liste der Anhänge anzeigen (Anzahl: 1)
So habe jetzt das gnaze fertig umgebaut und mit 300.000 Datensätzen versucht zu Importieren.

Ich bin zwar schon um einiges schneller benötige jedoch noch 3 Stunden dafür.

Ist es eigentlich möglich 300.000 Datensätze in einer Stunde zu Importieren ?

Oder habe ich in meien Source Code einen enormen Zeitfresser ?

Anbei sind auch die neuen Dateien ich bedanke mich mal im Voraus für die Hilfe.

hoika 12. Okt 2009 08:51

Re: Problem mit Datensatz Import
 
Hallo,

du benutzt dtmDataBase.TDtmDataBase.AsaSQLQuery
mehrfach mit unterschiedlichen SQL-Text.

Nimm für jede Abfrage eine eigene Query,
nimm Parameter und Prepare die Query vor dem ersten Aufruf.

Gibt es denn keinen SQL-Monitor für deine Komponenten ?

Da kannst du dir schön ansehen, wieviele Prepare's übers Netz gehen,
nämlich für den Datensatz mind 2 Stück (habs nur überfolgen).

Aussderde würde ich das "Feststellen, ob vorhanden"
per Select Count(*) machen (Auslesen per Query.Fields[0].AsInteger)
Dann wird nur eine Zahl zurückgegeben und nicht der komplette Datensatz.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 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-2025 by Thomas Breitkreuz