Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze schnell einfügen bzw. ersetzen (https://www.delphipraxis.net/180241-datensaetze-schnell-einfuegen-bzw-ersetzen.html)

Dejan Vu 25. Mai 2014 10:55

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von messie (Beitrag 1260153)
Was ist denn an meinem Statement falsch, dass es mit IBDAC nicht klappt aber in Flamerobin?

Geraten: Im Flamerobin ist eine andere Formatierung eingestellt (Datumsformat, Zahlen etc.) als in IBDAC. Daher der Rat, Parameter zu verwenden, denn dann werden die Werteformatierungen vom Provider vorgenommen, der vorher das RDBMS gefragt hat, wie die Parameter denn auszusehen haben.

mkinzler 25. Mai 2014 11:11

AW: Datensätze schnell einfügen bzw. ersetzen
 
Gerade dann bieten sich Parameter ja an. Die Abfrage brauchst du nur einmal setzen und dann nur noch die Parameter, es werden dann nur noch diese an das DBMS übertragen, Auch bei vollständigem Setzen der Abfrage musst sDu diese per ExecuteSQL senden.

messie 25. Mai 2014 11:54

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1260155)
Zitat:

Zitat von messie (Beitrag 1260153)
Was ist denn an meinem Statement falsch, dass es mit IBDAC nicht klappt aber in Flamerobin?

Geraten: Im Flamerobin ist eine andere Formatierung eingestellt (Datumsformat, Zahlen etc.) als in IBDAC. Daher der Rat, Parameter zu verwenden, denn dann werden die Werteformatierungen vom Provider vorgenommen, der vorher das RDBMS gefragt hat, wie die Parameter denn auszusehen haben.

Nee, scheint am falschen Abschluss der Zeilen zu liegen. Einzeilige Befehle gehen ohne Fehler, bei mehrzeiligen Befehlen hakt es am Beginn der zweiten Spalte.

Allgemein habe ich noch nicht kapiert, wie ich mit den Parametern das matching ersetzen soll. Ich habe drei Parameter, aus denen sich ein Datensatz eindeutig erkennen lässt.
Eingentlich brauche ich dann mit Parametern doch auch ein matching oder liege ich da falsch?

Grüße, Messie

Edit: klappt gut mit dem matching aber ist ziemlich langsam trotz autocommit=false und cachedupdate=true.

jobo 25. Mai 2014 13:05

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von messie (Beitrag 1260162)
Nee, scheint am falschen Abschluss der Zeilen zu liegen. Einzeilige Befehle gehen ohne Fehler, bei mehrzeiligen Befehlen hakt es am Beginn der zweiten Spalte.

Ich kenne keine Clientkomponenten, mit denen mehrere Befehle als Script abgesetzt
werden können. Was nicht bedeutet, dass es sie nicht gibt.
Einziges mir bekanntes Verfahren ist die Verwendung eines anonymen Blocks, in dem (größenbeschränkt) mehrere Statements hintereinander verarbeitet werden können.
Das geht aber nur bei bestimmten RDBMS, die das unterstützen und Parameter zu verwenden wird schwierig.

Zitat:

Edit: klappt gut mit dem matching aber ist ziemlich langsam trotz autocommit=false und cachedupdate=true.
Wenn Du satzweise matching durchführst, muss das System für jeden Satz einzeln die gesamte Tabelle nach den Parametern scannen, ggF. mangels Index sogar per Fullscan.
Wenn es Dir zu langsam ist, prüf die Indizierung Deiner Parameter Spalten (Achtung Begriffe: Index<>Fremdschlüssel Constraint) oder schau Dir noch mal meinen Vorschlag an, alles in 2 Schritten zu machen.

messie 25. Mai 2014 13:08

AW: Datensätze schnell einfügen bzw. ersetzen
 
Moin,

das Update mit Parametern dauert jetzt eine halbe Stunde und ist erst zu einem Drittel fertig. Da muss wohl eine Tabellenlösung her.
@jobo: hast Du da ein etwas konkreteres Beispiel für mich?

Danke, Messie

jobo 25. Mai 2014 16:57

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von messie (Beitrag 1260165)
st erst zu einem Drittel fertig. Da muss wohl eine Tabellenlösung her.
@jobo: hast Du da ein etwas konkreteres Beispiel für mich?

"etwas konkreter" ist ja dehnbar. ;)

also hier mein Vorschlag von oben:
Zitat:

* da empfiehlt sich ggF eine extra Importtabelle fürs Laden (alles rein, ohne Abgleich)

* im 2. Schritt dann die erwähnten Merges / Update or Insert Statements und zwar nicht Satz für Satz, sondern die komplette Zwischentabelle in einem Rutsch. Abgleich über fachliche Schlüsselfelder, ggf mehrere
konkreter:
1. CSV Import über externes File wie z.B. hier nach Tabelle 'Neudat<en':
http://www.delphipraxis.net/180125-w...-firebird.html

2. korreliertes Update des Bestandes
über deine 3(?) Parameter
Code:
UPDATE Bestandsdaten
   SET <column> = N.<NewColumn>
            ..
   FROM bestandsdaten AS B INNER JOIN Neudaten As N
   On B.NR = N.NR ...
3. Delete der NeuDaten, die bereits für Update verwendet wurden.
Statement (vor allem Join) wie oben nur eben delete

4. Insert der Restdaten
Code:
insert into Bestandsdaten <columns>
select <columns> from Neudaten
5. Leeren der restlichen Neudaten
Code:
delete / truncate Neudaten
So mal als Idee. Kann man ausbauen oder abändern, wenn man mehr Kontrolle braucht.
z.B. "sind meine 3 Parameter eindeutig?", ...
Wenn man beim Bestand unsicher ist, ob die Kriterien hinreichend sind, kann man z.B. auf das Delete (Step3) verzichten, das Insert komplexer abgleichen und damit die gesamte Tabelle "Neudaten" für Prüfungen bewahren.
Ist man nicht sicher, dass die Eindeutigkeit der Neudaten über die gewünschten Kriterien gegeben ist, kann nach dem Import erstmal Prüfstatements drüberlaufen lassen.

messie 25. Mai 2014 17:22

AW: Datensätze schnell einfügen bzw. ersetzen
 
Moin,

ich habe das Problem jetzt aufgeteilt. Es gibt zwei Situationen, das nachträgliche händische Ändern von Messwerten und den Datenimport. Letzterer ist einmalig, also nicht ganz so wichtig. Da muss ich dann eben warten.
Bei den nachträglich geänderten Werten hole ich mit jetzt die Daten in eine Query und vergleiche den Messwert mit dem neuen Wert im Array. So muss ich nur auf der DB schreiben wenn sich die Werte tatsächlich geändert haben. Und da man in dieser Situation eher nur wenige Werte ändert, ist das kein Problem bei der Performance mehr.

Danke für die Unterstützung :thumb:

Grüße, Messie

messie 26. Mai 2014 17:28

AW: Datensätze schnell einfügen bzw. ersetzen
 
Ätsch, so schnell kann es gehen :oops:
Ich habe jetzt doch zwei andere Stellen wo ich ein paar tausend Datensätze auf einmal einfügen muss.
Daher zuerst die Frage für die Update or Insert-Variante: wie bekomme ich den vom Trigger angelegten Index des Datensatzes im returning zurück? Das Feld ID wird mir verweigert.

Grüße, Messie

mkinzler 26. Mai 2014 17:33

AW: Datensätze schnell einfügen bzw. ersetzen
 
Bei IBDAC wird dieser in dem Parameter RET_ID zurückgegeben.

messie 26. Mai 2014 17:51

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von mkinzler (Beitrag 1260331)
Bei IBDAC wird dieser in dem Parameter RET_ID zurückgegeben.

Danke!:thumb:

Noch ein komischer Fehler:
Code:
UPDATE OR INSERT INTO table (P_ID,ST_NO,MEASUREMENTS) VALUES(:P_ID,:ST_NO,:MEASUREMENTS) MATCHING (P_ID,ST_NO) returning RET_ID into :ID;
wirft mir einen Fehler "unexpected end of command line" an am Komma zwischen den beiden matching-Spalten. Ohne returning läuft es problemlos durch.

Grüße, Messie

Edit: wenn ich kürzere Variablen verwende, bleibt das Problem an derselben Spalte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr.
Seite 3 von 4     123 4      

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