Hallo zusammen!
Mein Problem ist folgendes:
-
2 Tabellen, eine mit ca. 400.000 Datensätzen (kapdaten) und eine mit ca 32Mio Datensätzen (gesamtumsatz)
-
Auf Grundlage der kleineren Tabelle sollen Umsatzdaten in der größeren zeilenweise verschoben werden. Wichtig sind vor allem die beiden u.a. UPDATE-Befehle:
set ums_brut_n = ums_brut_n - k."Umsatz", menge_n = menge_n - k."Bez_Menge"
und
set ums_brut_n = ums_brut_n + k."Umsatz", menge_n = menge_n + k."Bez_Menge"
-
Die INSERT-Befehle ergänzen die große Tabelle mit Zeilen, die bisher nur in der kleinen Tabelle vorhanden waren.
-
Die komplette Funktion (s.u.) habe ich vorher an kleineren Test-Tabellen ausprobiert und keinerlei Probleme gehabt. Wende ich sie nun auf die beiden großen Tabellen an, braucht er für 100 Durchläufe der FOR-Schleife über eine Stunde und ist dann mit den ersten 100 Datensätzen immer noch nicht fertig!
Hilfe! Lassen sich die Abfragen irgendwie effektiver programmieren? Wenn ich auf 400.000 Datensätze hochrechne, komme ich auf eine Berechnungszeit von über einem Monat (!)
Es ist also ganz klar, dass ich mein Problem anders angehen muss – nur wie? Ich bin für jeden Tipp dankbar!
Ich bin kein Experte auf dem Gebiet und habe einfach aus dem Bauch heraus den Code geschrieben. Für mich ist es die logische Abfolge von notwendigen Befehlen um die Tabelle „gesamtumsatz“ zu aktualisieren. - Nur hatte ich noch nie das Vergnügen mit einer so großen Anzahl an Datensätzen…
Vielen Dank im Voraus für eure Antworten!
Grüße, Chris
create function updategesamtdaten () RETURNS void AS '
DECLARE
x double precision;
BEGIN
for x in 1..400000
Loop
insert into gesamtumsatz (
select store_id, "Best_Dat", art_id, 0, 0
from kapdaten_21_04_08
WHERE not exists
(select g.dat_id
from gesamtumsatz g, kapdaten_21_04_08 k
WHERE g.dat_id = k."Best_Dat"
AND g.store_id = k.store_id
AND g.art_id = k.art_id
and k."Kap_ID" = x)
AND "Kap_ID" = x
);
insert into gesamtumsatz (
select store_id, "Bez_Dat", art_id, "Bez_Menge", "Umsatz"
from kapdaten_21_04_08
WHERE not exists
(select g.dat_id
from gesamtumsatz g, kapdaten_21_04_08 k
WHERE g.dat_id = k."Bez_Dat"
AND g.store_id = k.store_id
AND g.art_id = k.art_id
and k."Kap_ID" = x)
AND "Kap_ID" = x
);
update gesamtumsatz
set ums_brut_n = ums_brut_n - k."Umsatz", menge_n = menge_n - k."Bez_Menge"
from kapdaten_21_04_08 k
WHERE gesamtumsatz.dat_id = k."Bez_Dat"
AND gesamtumsatz.store_id = k.store_id
AND gesamtumsatz.art_id = k.art_id
and k."Kap_ID" = x;
update gesamtumsatz
set ums_brut_n = ums_brut_n + k."Umsatz", menge_n = menge_n + k."Bez_Menge"
from kapdaten_21_04_08 k
WHERE gesamtumsatz.dat_id = k."Best_Dat"
AND gesamtumsatz.store_id = k.store_id
AND gesamtumsatz.art_id = k.art_id
AND k."Kap_ID" = x;
End Loop;
END;
'language plpgsql;