![]() |
AW: Datensätze schnell einfügen bzw. ersetzen
Zitat:
|
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.
|
AW: Datensätze schnell einfügen bzw. ersetzen
Zitat:
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. |
AW: Datensätze schnell einfügen bzw. ersetzen
Zitat:
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:
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. |
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 |
AW: Datensätze schnell einfügen bzw. ersetzen
Zitat:
also hier mein Vorschlag von oben: Zitat:
1. CSV Import über externes File wie z.B. hier nach Tabelle 'Neudat<en': ![]() 2. korreliertes Update des Bestandes über deine 3(?) Parameter
Code:
3. Delete der NeuDaten, die bereits für Update verwendet wurden.
UPDATE Bestandsdaten
SET <column> = N.<NewColumn> .. FROM bestandsdaten AS B INNER JOIN Neudaten As N On B.NR = N.NR ... Statement (vor allem Join) wie oben nur eben delete 4. Insert der Restdaten
Code:
5. Leeren der restlichen Neudaten
insert into Bestandsdaten <columns>
select <columns> from Neudaten
Code:
So mal als Idee. Kann man ausbauen oder abändern, wenn man mehr Kontrolle braucht.
delete / truncate Neudaten
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. |
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 |
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 |
AW: Datensätze schnell einfügen bzw. ersetzen
Bei IBDAC wird dieser in dem Parameter RET_ID zurückgegeben.
|
AW: Datensätze schnell einfügen bzw. ersetzen
Zitat:
Noch ein komischer Fehler:
Code:
wirft mir einen Fehler "unexpected end of command line" an am Komma zwischen den beiden matching-Spalten. Ohne returning läuft es problemlos durch.
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;
Grüße, Messie Edit: wenn ich kürzere Variablen verwende, bleibt das Problem an derselben Spalte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 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