Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze vergleiche (https://www.delphipraxis.net/96898-datensaetze-vergleiche.html)

Dumpfbacke 1. Aug 2007 12:51

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:
 Update Tabelle2
Set Datumsfeld = '01.08.07'
where Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6 
in (Select Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6  From Tabelle2)
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.

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

mkinzler 1. Aug 2007 13:03

Re: Datensätze vergleiche
 
Der Concat scheint sehr langsam zu sein. Versuchs mal mit dem ausführlichen Statement

DeddyH 1. Aug 2007 13:14

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)

hoika 1. Aug 2007 13:20

Re: Datensätze vergleiche
 
Hallo,

SQL-Code:
Update Tabelle2
Set Datumsfeld = '01.08.07'
where Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6
in (Select Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6  From Tabelle2)
Hast du das falsch abgetippt,
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:
Update Tabelle2
Set Datumsfeld = '01.08.07'
where Tabelle2.SumFeld1 not exists in
(Select Tabelle1.SumFeld From Tabelle1
Das Exisst sollte das noch etwas schneller machen.


Heiko
PS: Die beiden SumFeld können danach ja wieder gelöscht werden.

marabu 1. Aug 2007 14:39

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

Dumpfbacke 1. Aug 2007 17:14

Re: Datensätze vergleiche
 
Zitat:

Zitat von hoika
Hallo,


Hast du das falsch abgetippt,
es muss doch heissen
in ( XXXFrom Tabelle1)
statt Tabelle2

Oh ja da habe ich micht vertippelt.

Zitat:

Zitat von hoika
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 || ...)

Das habe ich gemacht und es hat nur einige Minuten gedauert.

Zitat:

Zitat von hoika
SQL-Code:
Update Tabelle2
Set Datumsfeld = '01.08.07'
where Tabelle2.SumFeld1 not exists in
(Select Tabelle1.SumFeld From Tabelle1
Das Exisst sollte das noch etwas schneller machen.

Hier ist nun meine Problem. Ich habe es weiterhin nur in versucht und es dauert und dauert. Ich habe es dann abgebrochen. Das Problem hier ist mein Interbase 6 kann nicht not existis in

Tanja
PS: Die beiden SumFeld können danach ja wieder gelöscht werden.[/quote]

grenzgaenger 1. Aug 2007 17:24

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

alzaimar 1. Aug 2007 18:24

Re: Datensätze vergleiche
 
Hier bietet sich z.B. Beyond Compare an, ein wirklich gutes Tool für diesen Zweck.

hoika 1. Aug 2007 21:29

Re: Datensätze vergleiche
 
Hallo

argzz

where not exists (select bla)

es heisst nicht not exists in (select() sondern not exists (select()


Heiko

beha 1. Aug 2007 22:08

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 21:09 Uhr.
Seite 1 von 4  1 23     Letzte »    

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