![]() |
Re: Datensätze vergleiche
Hallo Tanja,
Zitat:
![]() ![]() 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:
Freundliche Grüße
UPDATE tabelle2
SET datum = CURRENT_DATE() WHERE hash NOT IN (SELECT hash FROM tabelle1) |
Re: Datensätze vergleiche
Zitat:
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 |
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 |
Re: Datensätze vergleiche
Zitat:
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 |
Re: Datensätze vergleiche
Hallo Tanjy,
was dauert denn so lange, schon das Erzeugen von SumFeld ? oder die nachfolgende Query ? Heiko |
Re: Datensätze vergleiche
Zitat:
das Summenfled ist kein Problem. Dauert ca. 3-5 Minuten. Nur dann die Query habe ich nach 2 Stunden mal abgebrochen. Tanja |
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 |
Re: Datensätze vergleiche
Zitat:
Zitat:
SQL-Code:
Nicht getestet ! So würde ich zumindest mal anfangen. :mrgreen:
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^ |
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:
und
select * from tab1 order by ...
SQL-Code:
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.
select * from tab2 order by ...
grüsse gg |
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 01:44 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