Änderungs-Datensätze löschen

19/02/2009 - 10:02 von Rafael G. | Report spam
Hallo NG,

ich habe ein konzeptionelles Problem.
Habe hier eine C#-Anwendung, die auf den SQL-Server 2005 zugreift.
Die DB ist so konzipiert, dass es für die Änderungs-Verfolgung eine
separate Tabelle gibt, die im wesentlichen die Benutzer-ID und das
Änderungsdatum enthàlt. Die separate Tabelle ist dafür da, um spàter
bessere Auswerungsmöglichkeiten zu haben.

Daneben gibts vielleicht 20 Tabellen, die jeweils zwei FKs auf die
Änderungs-Tabelle haben (ErstellDatumFK und GeaendertDatumFK).
Nun kann es sein, dass sich mehrere Datensàtze einen Änderungs-Datensatz
teilen bspw., wenn sie durch einen einmaligen Import reingekommen sind.
Nun zum eigentlichen Problem. Wenn ich einen Datensatz löschen, dann
will ich das der oder die dazugehörigen Änderungs-Datensàtze gelöscht
werden. Das geht natürlich nur dann, wenn es keine anderen DS gibt, die
die Änderungsdatensàtze referenzieren. Dazu habe ich mir eine einfache
SP gebaut, die nach dem Löschen eines DS den/die Änderungs-DS löscht.

DELETE FROM [dbo].[Aenderungen] WHERE aeAenderungsID = @erfasstID OR
aeAenderungsID = @geaendertID

Das Problem ist, dass mit wachsender Datenbank (momentan ca. 2 Mio.
Datensàtze) das Prozedere den Löschvorgang des Datensatzes verlangsamt.
Wie könnte man das eleganter lösen, um vor allem eine bessere
Performance zu bekommen.

vg
Rafael
 

Lesen sie die antworten

#1 Elmar Boye
19/02/2009 - 14:58 | Warnen spam
Hallo Rafael,
Rafael G. schrieb:
ich habe ein konzeptionelles Problem.
Habe hier eine C#-Anwendung, die auf den SQL-Server 2005 zugreift.
Die DB ist so konzipiert, dass es für die Änderungs-Verfolgung eine
separate Tabelle gibt, die im wesentlichen die Benutzer-ID und das
Änderungsdatum enthàlt. Die separate Tabelle ist dafür da, um spàter
bessere Auswerungsmöglichkeiten zu haben.

Daneben gibts vielleicht 20 Tabellen, die jeweils zwei FKs auf die
Änderungs-Tabelle haben (ErstellDatumFK und GeaendertDatumFK).
Nun kann es sein, dass sich mehrere Datensàtze einen Änderungs-Datensatz
teilen bspw., wenn sie durch einen einmaligen Import reingekommen sind.
Nun zum eigentlichen Problem. Wenn ich einen Datensatz löschen, dann
will ich das der oder die dazugehörigen Änderungs-Datensàtze gelöscht
werden. Das geht natürlich nur dann, wenn es keine anderen DS gibt, die
die Änderungsdatensàtze referenzieren. Dazu habe ich mir eine einfache
SP gebaut, die nach dem Löschen eines DS den/die Änderungs-DS löscht.

DELETE FROM [dbo].[Aenderungen] WHERE aeAenderungsID = @erfasstID OR
aeAenderungsID = @geaendertID

Das Problem ist, dass mit wachsender Datenbank (momentan ca. 2 Mio.
Datensàtze) das Prozedere den Löschvorgang des Datensatzes verlangsamt.
Wie könnte man das eleganter lösen, um vor allem eine bessere
Performance zu bekommen.



Da gàbe es verschiedene Möglichkeiten:
Zunàchst auftrennen der einen Tabelle und verwenden einer
separaten History Tabelle (entweder für jede der 20 oder
nur für die intensiver genutzten).
Dadurch kannst Du direkt mittels DELETE CASCADE löschen
und erhàlst weniger Aktivitàt (wie Blockierungen) an einer Stelle

Eine weitere wàre, das Löschen nicht direkt durchzuführen,
sondern zeitlich verzögert über eine Aufràumprozedur, was
z. B. der SQL Server Agent nàchstens ausführen kann.

Auch kann man bei History Tabellen auf die referentielle
Integritàt verzichten (dann entfàllt DELETE CASCADE oben),
wodurch die Überprüfung seitens des SQL Servers entfàllt
(Setzt voraus, dass die Auswertungen darauf damit klar kommen).

Gruß Elmar

Ähnliche fragen