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 vergleiche (https://www.delphipraxis.net/96898-datensaetze-vergleiche.html)

marabu 2. Aug 2007 10:44

Re: Datensätze vergleiche
 
Hallo Tanja,

Zitat:

Zitat von Dumpfbacke
... kannst du mir sagen so ich so einen UDF bekommen kann und wie "Breit" dann der Hash-Wert ist. ...

ich habe zwei UDF Libraries gefunden, eine von Safa Rimeh (commercial) und eine von Richard Kotal (free).

Es ist eine hohe Kunst eine Aufgabenstellung so zu beschreiben, dass die Hilfestellung eines Unbeteiligten keinen schalen Beigeschmack hinterlässt. Bei deinem Problem irritiert mich, dass du zwei Textdateien vergleichen sollst (was man mit drei Unix Text Tools schnell erledigt hat) und diese Dateien im CSV-Format zu dir gelangen (was bedeutet, dass sie wohl Export-Dateien sind).

Auch weiß ich nicht, ob du diesen Vergleich regelmäßig oder einmalig durchführen willst und wie du das Ergebnis zurückgeben sollst. Ich gehe also einfach weiter davon aus, dass du lediglich ein performantes UPDATE-Statement für Interbase 6 suchst. Für eine optimale Lösung deines Problems müsste man statistische Informationen über deine Daten haben, wie alzaimar versteckt angedeutet hat.

Aber alles in allem sollten zwei mal 1 Mio Datensätze noch kein richtiges Problem darstellen. Um der Ungewissheit des Laufzeitverhaltens zu entgehen, würde ich zwei samples (1% und 5%) erstellen und mit denen die Zeit nehmen. Danach weißt du wie dein UPDATE-Statement skaliert und kannst die Wartezeit für den full set abschätzen und dein performance tuning anpassen.

SQL-Code:
UPDATE tabelle2
  SET datum = CURRENT_DATE()
  WHERE hash NOT IN (SELECT hash FROM tabelle1)
Freundliche Grüße

Dumpfbacke 2. Aug 2007 11:18

Re: Datensätze vergleiche
 
Zitat:

Zitat von marabu
Hallo Tanja,

ich habe zwei UDF Libraries gefunden, eine von Safa Rimeh (commercial) und eine von Richard Kotal (free).

Es ist eine hohe Kunst eine Aufgabenstellung so zu beschreiben, dass die Hilfestellung eines Unbeteiligten keinen schalen Beigeschmack hinterlässt. Bei deinem Problem irritiert mich, dass du zwei Textdateien vergleichen sollst (was man mit drei Unix Text Tools schnell erledigt hat) und diese Dateien im CSV-Format zu dir gelangen (was bedeutet, dass sie wohl Export-Dateien sind).

Auch weiß ich nicht, ob du diesen Vergleich regelmäßig oder einmalig durchführen willst und wie du das Ergebnis zurückgeben sollst. Ich gehe also einfach weiter davon aus, dass du lediglich ein performantes UPDATE-Statement für Interbase 6 suchst. Für eine optimale Lösung deines Problems müsste man statistische Informationen über deine Daten haben, wie alzaimar versteckt angedeutet hat.

Aber alles in allem sollten zwei mal 1 Mio Datensätze noch kein richtiges Problem darstellen. Um der Ungewissheit des Laufzeitverhaltens zu entgehen, würde ich zwei samples (1% und 5%) erstellen und mit denen die Zeit nehmen. Danach weißt du wie dein UPDATE-Statement skaliert und kannst die Wartezeit für den full set abschätzen und dein performance tuning anpassen.

SQL-Code:
UPDATE tabelle2
  SET datum = CURRENT_DATE()
  WHERE hash NOT IN (SELECT hash FROM tabelle1)
Freundliche Grüße

Hallo marabu
Ich habe mir die UDF mal gezogen und werde es mal prüfen. Die Daten würde ich schön öfters bekommen und auswerten. Das Ergebnis sollte dann in der Datenbak weiter verarbeitet werden.

Tanja

hoika 2. Aug 2007 11:23

Re: Datensätze vergleiche
 
Hallo Tanja,

mein SQL-Code sllte ja nur zeigen,
dass Interbase6 sehr wohl das exists kennt.
Die Nutzung von ist angeblich schneller als IN.

Zur Performance.
Warum einen Hash erzeugen, wenn es mit Concat
(wie in meinem Bsp mit dem SumFeld) auch geht.

OK, das mit dem einfachen Zusammenziehen war nicht so gut,
aber ein feld1 || , feld2 || ,

sollte doch reichen ?


Heiko

Dumpfbacke 2. Aug 2007 12:02

Re: Datensätze vergleiche
 
Zitat:

Zitat von hoika
Hallo Tanja,

mein SQL-Code sllte ja nur zeigen,
dass Interbase6 sehr wohl das exists kennt.
Die Nutzung von ist angeblich schneller als IN.

Zur Performance.
Warum einen Hash erzeugen, wenn es mit Concat
(wie in meinem Bsp mit dem SumFeld) auch geht.

OK, das mit dem einfachen Zusammenziehen war nicht so gut,
aber ein feld1 || , feld2 || ,

sollte doch reichen ?


Heiko

Hallo Heiko,
ja es reicht schon, jedoch habe ich es nach ca. 2 Stunden abgebrochen. Es kann ja noch Tage laufen bzw. in 5 Minuten fertig sein.
Tanja

hoika 2. Aug 2007 12:28

Re: Datensätze vergleiche
 
Hallo Tanjy,

was dauert denn so lange, schon das Erzeugen von SumFeld ?
oder die nachfolgende Query ?


Heiko

Dumpfbacke 2. Aug 2007 15:51

Re: Datensätze vergleiche
 
Zitat:

Zitat von hoika
Hallo Tanjy,

was dauert denn so lange, schon das Erzeugen von SumFeld ?
oder die nachfolgende Query ?


Heiko

Hallo Heiko,
das Summenfled ist kein Problem. Dauert ca. 3-5 Minuten. Nur dann die Query habe ich nach 2 Stunden mal abgebrochen.

Tanja

hoika 2. Aug 2007 17:10

Re: Datensätze vergleiche
 
Hallo Tanja,

1. zeig noch mal die Query

2. nimm etwa 1000 Einträge pro Tabelle
und teste die Query im IBPlanalyzer



Heiko

Hansa 2. Aug 2007 19:13

Re: Datensätze vergleiche
 
Zitat:

Zitat von Dumpfbacke
...Es liegen zwei CSV Dateien mit jewals fast 800.000 Datenstzäte vor. Diese beiden Dateien habe ich ich zwei Tabellen im Interbase geschrieben...

Tabelle 2 soll also auf dem neuesten Stand sein, in Abhängigkeit von Tabelle 1 ?

Zitat:

Zitat von Dumpfbacke
...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.

Na, dann muss die Tabelle 2 wohl sequentiell durchlaufen werden (Sortierung spielt keine Rolle, da es sowieso jeden DS in Tabelle 2 betrifft). DS in Tabelle 1 vorhanden => Datum setzen. Habe ich das richtig verstanden ? Falls ja, dan würde ich folgende stored Procedure bauen und über die Tabelle 2 laufen lassen (geht auch ohne EXISTS) :

SQL-Code:
CREATE PROCEDURE NEUTABLESP (
    ID,
    FELD1 VARCHAR (...
...
    FELD6
As
Declare Variable VORHANDEN Integer;
BEGIN
  VORHANDEN = -1;
  SELECT ID FROM TABLE1 WHERE (FELD1= :FELD1) AND
...
     (FELD6= :FELD6) INTO :VORHANDEN;
  IF (VORHANDEN >= 0) THEN BEGIN
    UPDATE TABLE2 SET DATUM=CURRENT_TIMESTAMP
    WHERE (FELD1= :FELD1) AND
...
     (FELD6= :FELD6)
  END
  SUSPEND;
END^
Nicht getestet ! So würde ich zumindest mal anfangen. :mrgreen:

grenzgaenger 2. Aug 2007 20:49

Re: Datensätze vergleiche
 
@hansa, die sortierung spielt soweit eine rolle, dass bei zwei unsortierten datensätzen, die eine datei immer wieder vom beginn an gelesen werden muss, was sich auf die laufzeit niederschlägt. wenn beide sortiert sind, dann braucht jede tabelle exact 1x durchlaufen werden und alle änderungen, inserts, deletes sind ermittelt.

@Dumpfbacke, dann kannste ja auch die sortierfunktion deiner datenbank nutzen, wenn du die flat files nicht sortieren möchtest. da brauchste aber zwei cursor nach folgendem schema...
SQL-Code:
select * from tab1 order by ...
und
SQL-Code:
select * from tab2 order by ...
wobei die sortieroptionen die selben sidn. und dann einfach wie bei zwei flat files durchschleifen... ein durchlauf über tab1 und die tab2 als slave und wenn du am ende angekommen bist, haste alle infos.

grüsse
gg

Hansa 2. Aug 2007 21:04

Re: Datensätze vergleiche
 
Wozu soll denn da die Sortierung eine Rolle spielen ? Wozu soll das gut sein ? :gruebel: Nochmals grob mein Vorschlag : sequentiell über Tabelle 2 wandern. Bei jedem Datensatz anhalten und die SP ausführen. Die soll in Tabelle 1 gucken, ob ein gleicher Datensatz existiert oder nicht. Falls ja => aktuellen Datensatz von Tabelle 2 updaten (Datum setzen) -> nächster DS von Tabelle 2. Selbes Spielchen durchführen bis EOF von Tabelle 2. DS, die in beiden Tabellen vorhanden sind haben dann ein Datum und die nicht in Tabelle 1 enthaltenen eben nicht. Und fertig. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:30 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