Laden...

Suche Designvorschlag im Umgang mit Massendaten

Erstellt von Andreas@Tricept vor 12 Jahren Letzter Beitrag vor 12 Jahren 638 Views
A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 12 Jahren
Suche Designvorschlag im Umgang mit Massendaten

verwendetes Datenbanksystem: MSSQL, Oracle, DB2

Hallo,

ich habe derzeit eine Kosten-Leistungsverrechnung in .Net mit DataSets realisiert.
Es geht darum Kosten von einem Konto auf andere Konten zu verteilen.
Ich habe dazu folgende vereinfachte DB-Struktur (Im Anhang zu sehen).

Also Konten die Kostensätze halten. Die Kostensätze haben variable Attribute die der Kunde für sich anlegt. Ein Kostensatz kann 0-x Attribute haben.

Die Verrechnung definiert welches Konto auf welches andere Konto zu welchem Prozentsatz verrechnet werden soll. Dazu werden die Kostensätze und deren Attribute von einem Konto in ein anderes kopiert und der jeweilige Kostenwert dem Prozentsatz angepasst.

Mein Problem ist Performence. Ich lese die Daten per Adapter ein und füge einem DataSet die entsprechenden neuen Einträge hinzu um so die Verrechnung durchzuführen. Anschießend kommt ein Adapter Update. Der Vorgang dauert leider bei ein paar haundert-tausend Einträgen mehrere Stunden. Das möchte ich nun optimieren und wollte mal fragen welche Ansätze ihr da seht. Das ganze soll auf MSSQL, Oracle und DB2 Basis funktionieren.

Ich dachte jetzt zunächst das ich die tatsächliche Verrechnung ausschließlich auf SQL Statement Basis realisiere indem ich vielleicht mit "Insert into Select" arbeite.
So kann ich zwar Einträge kopieren, ich weiss dann jedoch nicht wie ich den Primärschlüssel hochsetzen kann. Bisher mein SQL:

Beispiel für SQL Statement und die Verrechnung für das Konto 2:
Insert into Kostensatz Select ID, Datum, Wert, 2 as Konto from Kostensatz Where Konto = 1

Das geht leider nicht weil ich die ID nicht hochsetze und ein "Select max(ID) from Kostensatz" geht an der Stelle des Selects ja nicht, sodass es so ähnlich aussehen würde:
Insert into Kostensatz Select (Select max(ID) from Kostensatz) as ID, Datum, Wert, 2 as Konto from Kostensatz Where Konto = 1

Habt ihr eine Idee dazu oder einen ganz anderen Anatz?

502 Beiträge seit 2004
vor 12 Jahren

Also ich bin mir nicht sicher ob ich Dein Datenmodell richtig verstanden habe (von der auszuführenden Logik mal ganz abgesehen) und ich bin auch kein Experte was Oracle und DB2 angeht (dafür aber bei MSSQL ganz fit) - aber ich versuch mal trotzdem ein paar Dinge zu klären...

Du versuchst die Einträge der Kostensatz-Tabelle anhand der Definition in der Verechnungstabelle quasi "aufzuteilen" - so weit korrekt?

Dann sollte das INSERT INTO ... SELECT ... durchaus das Mittel der Wahl sein (und zwar auch performant, was aber extrem von weiteren Faktoren abhängen kann, z.B. Menge der Daten, Struktur der SELECT Query, Indizierung der Tabellen, etc.). Das SELECT Statement hierbei muss nur etwas cleverer werden (z.B. mit JOINs), damit Du die benötigten Daten für das INSERT direkt zusammen ziehen kannst. Dafür müsste ich aber das Datenmodell besser verstehen...

Das Problem mit der neu zu vergebenden ID solltest Du IMHO der Datenbank überlassen - beim SQL Server gibt's hierfür die IDENTITY, bei Oracle glaub ich auch und ich bin mir sehr sicher, dass es was vergleichbares auch bei DB2 gibt (das gibt's ja selbst in Access...)

Was ich allerdings noch nicht verstanden habe: Wozu gibt's die Tabelle KostensatzAttribute? Ist das eine 1:1 Beziehung zu Kostensatz? Warum ist das in einer extra Tabelle? Möglicherweise kommt das ja durch die vereinfachte Darstellung aber ich denke, dass hier auch erst mal eine Normalisierung durchgeführt werden sollte.

Beschreib doch mal Dein Problem ein wenig besser - dann kann Dir auch weiter geholfen werden.

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...