PDA

Vollständige Version anzeigen : UPDATE Anweisung dauert zu lange


cheerookee
13.06.2002, 10:06
Folgendes Problem:
Ich versuche anhand unserer Zeiterfassung Projektlaufzeiten aufzukumulieren.
Dazu gibt es eine Tabelle KTrEntwicklung mit den Feldern
LfdTag: Laufende Nummer des Tages seit Projektbeginn
KSt: Kostenstelle
KTr: Kostenträger = Projekt
Stunden: Anzahl Stunden die an diesem Tag gearbeitet wurden.
KumStunden: Anzahl Stunden, die bis zu diesem Tag seit Projektbeginn gearbeitet wurden.

Mit untenstehender Query kumuliere ich die Anzahl Stunden für jedes Projekt bis zum laufenden Tag auf, was allerdings unendlich lange dauert (>2 Std.; z.Zt. ca. 2.3 Mio Datensätze) weshalb ich von unserem EDV- Typen täglich gefaltet werde:

Update KTrEntwicklung set
KumStunden =
(
select sum(Stunden)
from KtrEntwicklung
where
LfdTag <= K.LfdTag and
KSt = K.KSt and
KTr = K.KTr
)
from KTrEntwicklung K

Hat einer 'ne Idee wie es schneller geht?!

Joachim Hofmann
16.06.2002, 21:41
Hallo,

ich weiß es auch nicht wirklich... aber eine interessante Frage, zumal ich solche Update-Konstellationen mit beschriebenem Zeitproplem auch schon mal gesehen habe, mir aber keinen Reim drauf machen konnte.

Was für Indizes sind auf die Spalten gelegt?

Kann man diese Abfrage auch mal in einem unprotokollierten Datenbankmodus ausführen?
(Das Transaktionsprotokoll kann bei Aktionen über ganze Tabellen zuweilen stark beansprucht werden, soweit ich weiß.)

cheerookee
17.06.2002, 10:20
Was für Indizes sind auf die Spalten gelegt ?
Die Tabelle Tabelle besitzt keine PK / FK, da sie nur "saubere" Daten enthalten kann.

Die Tabelle enthält "nur" die vom Server standardmäßig angelegten Indizes _WA_Sys_xxxx_yyy
von denen ich allerdings nicht weiss, was sie machen.

... unprotokollierter Datenbankmodus
Wie kann ich das Transaktionsprotokoll den abhängen?

Gruss

cheerookee

Ralph71
26.06.2002, 10:16
Hi, wenn ich das richtig verstehe, dann addierst Du jeden Tag zu "(nicht) vorhanden" Summen ein paar neue Zahlen dazu, rechnest also zu 99,9% immer das gleiche.
Warum lässt Du das Ergebnis des Vortages nicht in eine zweite Tabelle speichern (incl. des letzten Eintrages im Feld LfdTag (mittels max(LfdTag)müsste das ganz schnell funzen). Dann holst Du dir am nächsten Tag die "alten" Summen und addierst die neuen Zahlen, die ja im Feld LfdTag eine höheren Wert haben als die am Vortag gespeicherte LfdTag (vgl. max(LfdTag)) einfach hinzu. Fertig.
Kann sein, dass ich da jetzt völlig falsch liege, aber...

Ralph

cheerookee
27.06.2002, 09:13
@Ralph: Prinzipiell super Idee, hatte ich auch erst ausprobiert...
ABER... da in der Zeiterfassung, an die ich mich drangeklinkt habe, u.U. nach einigen Tagen noch Daten geändert werden, weil einem auffällt, dass er ja mittags durchgearbeitet hat, ist das "neue Daten aufaddieren" in diesem Punkt ungenau. Die Zeiterfassung setzt ausserdem auch kein Statusbit, welches mir anzeigen würde, welche Daten neu oder geändert sind.
Deshalb Truncate ich pauschal meine ganze Stundentabelle und bau' sie anschliessend wieder neu auf.

Ralph71
27.06.2002, 13:12
Hi,
Dann wirds sehr schwierig, denn bei nachträglichen Änderungen muss der alte Datensatz von der Summe abgezogen werden und der neue, geänderte addiert. Einen gänderten Datensatz zu erkennen wäre kein größeres Problem. Aber der Rest... Fällt mir im Moment nix ein. Evtl. müsste man den geänderten Datensatz mit den alten Werten vorher in eine neue Hilfs-Tabelle abspeichern, d.h. es muss erkannt werden, ob es sich um einen Neueintrag oder um eine Änderung handelt.
Ralph