![]() |
Datenbank: Interbase • Version: 6.01 • Zugriff über: IBX
Datensätze vergleiche
Hallo,
ich hänge immernoch an meinem Problem mit den 800.000 Datensätze. Nun hänge ich an einer anderen Stellen, da nun die Wünsche geändert wurden. Ich beschreibe mal die Gegebenheiten und mein Problem. Villeicht könnt Ihr mir ja nochmals helfen. Als Ergebnis sollte herrauskommen: Welche sind neue Daten und bei welchen hat sicht etwas geändert. Es liegen zwei CSV Dateien mit jewals fast 800.000 Datenstzäte vor. Diese beiden Dateien habe ich ich zwei Tabellen im Interbase geschrieben. (Kein Problem geht sehr zügig) Die 1. Tabelle sind so aufgebaut Feld1 VarChar(150) Character Set ISO8859_1 Feld2 VarChar(150) Character Set ISO8859_1 Fled3 VarChar(40) Character Set ISO8859_1 Feld4 VarChar(3) Character Set ISO8859_1 Feld5 VarChar(20) Character Set ISO8859_1 Fled6 VarChar(10) Character Set ISO8859_1 Die 2. Tabelle sieht genau so aus hat jedoch noch ein Feld für ein Datum In der 1. Tabelle sind die alten Daten und in der 2. Tabelle sind die neuen Daten. Nun wollte ich in alle Datensätze in der Tabelle2 das aktuelle Datum schreiben, wenn die Datensatz in der Tabelle1 vorhanden ist. Somit müßte der rest ohne Datum dann neu sein oder geändert worden. Dazu habe ich es zuerst versucht mit einen Update
SQL-Code:
Das ganze lief zwei Stunden und es hat sich nicht getan. Da habe ich es mal abgebrochen, da es villeicht noch Tage dauern kann bis das Ergebnis vorliegt.
Update Tabelle2
Set Datumsfeld = '01.08.07' where Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6 in (Select Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6 From Tabelle2) Dann habe ich auf jedes Feld einen Index gesetzt. Einen Index über alle Felder geht ja leider nicht, da er ja zu "breit" ist. Leider Das ganze mit den Abgleich kann auch genre 10 Stunden dauern nur das Ergebnis sollte stimmen. Also dacht ich mir mach es halt über ein Schleife. Ja mir ist bekannt es ist das schlechteste ist was ich machen kann. Alle Datensätze der Tabelle 1 hole ich in eiene TIBQuery und mittels einer Schleife suche dann mittels einer TIBQuery den Datensatz in Tabelle2. Wenn das Ergebnis nicht Leer ist setzte ich das Datum. Wenmn ein Feld nicht übereinstimmt wurde etwas geändert. Das ganze geht auch, würde jedoch ca. 123 Stunden dauern und das ist mir etwas zu lange. Kann mir jemand hier einen Tip geben wie ich es schneller hinbekommen werden. Man die Leute haben wünsche. Sage mir mal den Unterschied bei 800.000 Datensätzen. :wall: :gruebel: Tanja |
Re: Datensätze vergleiche
Der Concat scheint sehr langsam zu sein. Versuchs mal mit dem ausführlichen Statement
|
Re: Datensätze vergleiche
Ich würde es so versuchen (ungetestet):
SQL-Code:
UPDATE Tabelle2 B
SET B.Datumsfeld = '01.08.2007' WHERE EXISTS( SELECT * FROM Tabelle1 A WHERE A.Feld1 = B.Feld1 AND A.Feld2 = B.Feld2 AND A.Feld3 = B.Feld3 AND A.Feld4 = B.Feld4 AND A.Feld5 = B.Feld5 AND A.Feld6 = B.Feld6) |
Re: Datensätze vergleiche
Hallo,
SQL-Code:
Hast du das falsch abgetippt,
Update Tabelle2
Set Datumsfeld = '01.08.07' where Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6 in (Select Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6 From Tabelle2) es muss doch heissen in ( XXXFrom Tabelle1) statt Tabelle2 Nun zum Speed Ich würde in beide Tabellen ein SumFeld Varchar(XXX) (Summe aller Felder) eintragen, es per Update füllen (Update Table1 Set SumFelds = Field1 || Field 2 || ...)
SQL-Code:
Das Exisst sollte das noch etwas schneller machen.
Update Tabelle2
Set Datumsfeld = '01.08.07' where Tabelle2.SumFeld1 not exists in (Select Tabelle1.SumFeld From Tabelle1 Heiko PS: Die beiden SumFeld können danach ja wieder gelöscht werden. |
Re: Datensätze vergleiche
Hallo Tanja,
eine weitere Möglichkeit: Vor dem Laden der Dateien ein Feld mit dem Hash-Wert aller Feldinhalte hinzufügen - oder auch nach dem Laden über eine MD5 UDF, einen Index auf den Hash setzen und ein UPDATE mit dem bereits gezeigten Sub-Select. Freundliche Grüße |
Re: Datensätze vergleiche
Zitat:
Zitat:
Zitat:
Tanja PS: Die beiden SumFeld können danach ja wieder gelöscht werden.[/quote] |
Re: Datensätze vergleiche
hallo tanja,
sag mal, sind die datensätze sortiert? falls ja, brauchst du die tabellen nicht in eine datenbank zu schreiben, sondern nur die beiden tabellen lesen, durchschleifen und die unterschiede ausgeben... sollte programmmässig in ein paar sekunden durchgelaufen sein. aber die tabellen müssen nach dem primärschlüssel sortiert sein. sonst musst du immer die ganze tabelle durchhangeln und das geht in die zeit... grüsse gg |
Re: Datensätze vergleiche
Hier bietet sich z.B. Beyond Compare an, ein wirklich gutes Tool für diesen Zweck.
|
Re: Datensätze vergleiche
Hallo
argzz where not exists (select bla) es heisst nicht not exists in (select() sondern not exists (select() Heiko |
Re: Datensätze vergleiche
Hallo,
ich möchte nur noch anmerken, dass man mit der zu Beginn erwähnten Concat-Lösung eine Änderung an einem Datensatz evtl. nicht findet, obwohl diese stattgefunden hat. Beispiel: alter Datensatz: Feld1=ABC Feld2=DEF ... neuer Datensatz: Feld1=AB Feld2=CDEF ... hier hat sich was geändert, aber die Änderung würde anhand eines Vergleichs von Feld1 || Feld2 nie festgestellt werden ! Also, falls so was in der Praxis vorkommen kann, kann ein Vergleich mittels || nicht das gewünschte Ergebnis liefern. beha |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 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