![]() |
Datenbank: EMS FireBird • Version: 1.5 • Zugriff über: Delphi 7 ZQuery
Datenimport ohne Doppelte Daten mit SQL
Hallo zusammen,
Ich habe 2 Tabellen. Tabelle1 "TB_IMPORT" wird mit Daten aus *.xls oder *.txt gefüllt. Tabelle2 "TB_RP2013" soll mit Daten aus Tabelle1 befüllt werden aber keine schon vorhandenen Daten. In beiden Tabellen gibt es das Feld "BEWNR" = Bewegnummer was eindeutig ist. Mein momentaner Ansatz.
Delphi-Quellcode:
Es werden alle 2 Stunden cs. 10.000 Daten eingelesen was mit unter sehr langsam ist.DBF2 := ZQuery2; DBF3 := ZQuery3; vJAHR:= '2013'; with DBF2 do begin SQL.Clear; SQL.Text:= 'SELECT '+ 'TB_IMPORT.GEBUCHT, '+ 'COUNT(TB_IMPORT.BEWNR) AS DOPPELT, '+ 'TB_RP'+vJAHR+'.BEWNR '+ 'FROM '+ 'TB_IMPORT '+ 'INNER JOIN TB_RP'+vJAHR+' ON (TB_IMPORT.BEWNR=TB_RP'+vJAHR+'.BEWNR) '+ 'GROUP BY '+ 'TB_IMPORT.GEBUCHT, '+ 'TB_RP'+vJAHR+'.BEWNR'; DBF2.Active:= True; Form1.ProgressBar1.Max:= DBF2.RecordCount; while NOT DBF2.Eof do begin vBEWNR := DBF2.FieldValues['BEWNR']; Form1.ProgressBar1.Position:= DBF2.RecNo; with DBF3 do begin SQL.Clear; SQL.Text:= 'UPDATE TB_IMPORT SET GEBUCHT = 1 WHERE '+ 'TB_IMPORT.BEWNR = ' + vBEWNR; DBF3.ExecSQL; end; Label3.Caption:= IntToStr(DBF2.RecordCount); Form1.Repaint; DBF2.Next; end; end; Ich denke, ich hatte das schon mal schneller. Nur leider sind von meiner 1. Version verschiedene Units verloren gegangen. Ich habe nur noch die *.exe Datei aber da finde ich nicht alles. Habt Ihr eventuell einen hinweis was ich noch ändern sollte oder kann? Vielen Dank |
AW: Datenimport ohne Doppelte Daten mit SQL
1. arbeite mit Transaktionen
1.1. damit die Transaktion nicht zu groß wird, kannst du nach X Datensätzen ein commit ausführen. Nach wie vielen Datensätzen genau der richtige Zeitpunkt ist, musst du ausprobieren 2. arbeite mit prepared-statements 2.1. dafür musst du auch mit Parametern arbeiten, statt dir den SQL-Befehl ständig neu zusammenzubasteln... 3. nach jedem Datensatz ein Repaint? Ich würde das Repaint vielleicht nur nach allen 500 Datensätzen oder so durchführen (falls überhaupt erforderlich) |
AW: Datenimport ohne Doppelte Daten mit SQL
Hallo!
Habe zwar noch nicht mit einer Firebird DB gearbeitet, aber in anderen Datenbanken ist die Syntax so oder so ähnlich:
Code:
Grüße,
insert [felder] into tab2 from
(select [felder] from tab1 alias1 where not exists (select [felder] from tab2 where key = alias1.key) ) Werner |
AW: Datenimport ohne Doppelte Daten mit SQL
Ups das ging aber schnell,
vielen Dank erst mal. #Morphie P3. Das anzeigen der RecordCount kommt wieder raus, ist nur momentan zur anzeige. P1 bis P2.1 komm ich jetzt nicht so ganz mit. Es soll nur der doppelte Satz mit einem Zeichen markiert werden. Lieber währe es mir ich kann den Satz gleich Löschen. Aber das ist ja warum auch immer noch langsamer. Könntest Du mir mit P1 mal einen kleinen weiteren Tip geben? #weisswe Das hatte ich auch schon durch hierbei brauch die DB ca. 1 Std bei 9400 Sätzen. Warum auch immer. Vielen Dank |
AW: Datenimport ohne Doppelte Daten mit SQL
U.U. bietet sich hier ein MERGE oder UPDATE OR INSERT an
|
AW: Datenimport ohne Doppelte Daten mit SQL
Zitat:
Ich weiß nicht genau wie ZEOS das intern macht, aber ich vermute, wenn du keine Transaktion explizit angibst / erzeugst, erzeugt ZEOS eine Transaktion automatisch. In deinem Beispiel würde ZEOS automatisch für jeden Datensatz eine eigene Transaktion erzeugen. Das ist natürlich nicht sinnvoll... Du müsstest dir also zu Beginn der Methode eine Transaktion erzeugen, dem Query zuordnen und am ende (oder zwischendurch) ein Commit (Speichern) der Transaktion durchführen. P2.1: Du setzt in jedem Schleifendurchlauf (Datensatz) den Commandtext für DBF3 neu. Den solltest du aber nur einmalig vor der Schleife setzen:
Code:
anschließend ein
UPDATE TB_IMPORT SET GEBUCHT = 1 WHERE TB_IMPORT.BEWNR = :PAR_BEWNR;
Delphi-Quellcode:
um den Befehl zur Datenbank zu schicken.
DBF3.Prepare;
In dem Moment weiß die Datenbank genau, was sie machen soll. Ihr fehlen aber noch die entsprechenden Datensätze / Werte. Also füllst du jetzt innerhalb der Schleife den Parameter ":PAR_BEWNR" mit deiner Variable vBEWNR und führst ein Execute durch. Wenn du das so machst, hast du gleich mehrere Vorteile: 1. du verringerst den Traffic zum Datenbankserver. 2. der Server weiß bereits, was er zutun hat, muss den Befehl also nicht jedes Mal neu parsen. 3. du kannst dir so keine SQL-Injections einfangen... |
AW: Datenimport ohne Doppelte Daten mit SQL
Zitat:
@mkinzler "update or insert" geht nicht mit seiner 1.5 er Version |
AW: Datenimport ohne Doppelte Daten mit SQL
Wenn es hier im Gegensatz zu Überschrift nur darum geht bereits vorhandene Datensätze zu kennzeichnen, genügt dann nicht ein Befehl an die Datenbank?
Code:
In der Tabelle "tb_rp2013" sollte ein eindeutiger Index auf "bewnr" vorhanden sein.
update tb_import a
set a.gebucht = (select count(b.bewnr) from tb_rp2013 b where (b.bewnr = a.bewnr)) |
AW: Datenimport ohne Doppelte Daten mit SQL
Hallo zusammen,
Stimmt, meine Überschrift zum Thema ist in dem Sinne Falsch. Sorry mein Fehler ich habe schon zuweit gedacht. Die Daten die Doppelt sin sollen gekennzeichnet werden. Einen Index kann ich nicht auf das Feld "BEWNR" legen, weil in der Tabelle TB_RP2013 die Bewegnummer durchaus Doppelt sein kann. Diese habe dann aber einen Präfix. Und nur die Daten aus der Importtabelle dürfen nicht doppelt vorkommen. Ist schon etwas verrückt, aber es soll so sein. Ich hatte jetzt mal den Code von #hstreicher mit den EMS FireBird Manager getestet. Der Code wurde angenommen aber nach ca. 1 1/2 Std. hat sich mein Server wegen Überhitzung erstmal verabschiedet. Nun habe ich erst mal Serverprobleme die ich beheben muss und melde mich wieder, wenn alles wieder Funktioniert. Erst mal Vielen Dank für die Hilfe bis Später |
AW: Datenimport ohne Doppelte Daten mit SQL
Zitat:
|
AW: Datenimport ohne Doppelte Daten mit SQL
Hallo zusammen,
Vielen Dank für die Anregungen. Ich habe jetzt einen Index auf das Feld "Bewnr" gesetzt und die Procedure von #hstreicher eingeschrieben. Nun werden die bereits vorhanden Daten Markiert und das bei 10.852 Sätzen in gerademal 10-15 Sec. Einfach klasse. Ich hatte etwas mit dem Index verwechselt und zwar, dass ich nur eindeutige werte haben muss. Mal noch eine Frage zu Bildern "BLOB" in der EMS FireBird. Seit dem jeder User Bilder einfügen kann ist die DB größe sehr schnell auf ca. 120 MB gewachsen. Dadurch ist auch das anzeigen einer Tabelle "cxGrid" um einiges langsamer geworden. Was kann ich da ändern, das die Bilder nur eine Bestimmte größe haben. Und können die Bilder auch im nachhinein sinnvoll geändert werden? Die Eigenschaften vom Feld "L_FOTO BLOB sub_type 2 segment size 1" Vielen Dank |
AW: Datenimport ohne Doppelte Daten mit SQL
Blobs werden nicht in der eigentlichen Tabelle gespeichert, dort steht nur ein Verweis auf die Daten.
Wenn du die größe der Bilder beschränken willst, dann verkleinere diese beim Import oder beim Auslesen |
AW: Datenimport ohne Doppelte Daten mit SQL
#mkinzler
ok Danke. nagut, dann Fleißarbeit und Bilder neu Laden.:oops: |
AW: Datenimport ohne Doppelte Daten mit SQL
Ist es gewollt, dass die Bilder im Grid automatisch angezeigt werden sollen? Wenn nein, dann schau mal ob es in deinem Grid (oder Zugriffskomponenten) etwas gibt, wo man das automatische Laden von BLOB-Inhalten unterdrücken kann.
|
AW: Datenimport ohne Doppelte Daten mit SQL
Hallo,
#tsteinmaurer Ja die Bilder müssen mit Angezeigt werden damit die User entsprechendes Material nachsehen können. Ich suche gerade nach einer Option oder Irgendetwas, wo ich die Bilder mit einem Zug nach einem Ordner Senden kann. Bisher bin ist es noch nicht gelungen. Alle Felder werden Exportiert außer Bilder. Gruß Detlef |
AW: Datenimport ohne Doppelte Daten mit SQL
Hallo,
so, ich habe jetzt erstmal die Datenbank aufgeräumt und vor allem die Bilder erheblich kleiner abgespeichert. Durch die Änderung ist der gesamte Zugriff auch deutlich schneller. noch eine Frage. Nun werden ca 10.000 Daten aus Excel in ca 18 min in eine Tabelle eingelesen. ist das OK? oder geht das auch schneller? Grüße Detlef |
AW: Datenimport ohne Doppelte Daten mit SQL
Kling sehr langsam, es kann aber an der Excel Anbindung liegen.
oder irgendwelchen Statusupdates im GUI wenn die Daten die eingefügt werden nicht sehr gross sind und keine Trigger irgendwelche komplexen Tätigkeiten durchführen sollte das aber viel schneller gehen so ins Blaue hinein würde ich sagen 10 mal schneller sollte drin sein |
AW: Datenimport ohne Doppelte Daten mit SQL
#hstreicher
stimmt das geht wirklich. Ich lese jetzt ges. 9956 Daten aus Excel in 3 - 5 Sek. in ein Memo ein. Vielen Dank Gruß Detlef |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 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