Soft Delete - IsDeleted-Flag verwenden oder Joiner-Tabelle trennen?

8

Sollten wir ein Flag für das Löschen oder eine separate Tischplatte verwenden? Was ist effizienter? Datenbank ist SQL Server.

Hintergrundinformationen

Vor einiger Zeit hatten wir einen DB-Berater, der unser Datenbankschema betrachtet. Wenn wir einen Datensatz weich löschen, aktualisieren wir ein Flag IsDeleted in den entsprechenden Tabellen. Es wurde vorgeschlagen, anstelle der Verwendung eines Flags die gelöschten Datensätze in einer separaten Tabelle zu speichern und einen Join zu verwenden, da dies besser wäre. Ich habe diesen Vorschlag auf den Prüfstand gestellt, aber zumindest auf der Oberfläche scheint die zusätzliche Tabelle und der Join teurer zu sein als die Verwendung einer Flagge.

Erstprüfung

Ich habe diesen Test eingerichtet.

Zwei Tabellen, Beispiel und DeletedExample. Ich habe einen Nonclustered-Index für die IsDeleted-Spalte hinzugefügt.

Ich habe drei Tests durchgeführt und eine Million Datensätze mit den folgenden gelöschten / nicht gelöschten Quoten geladen:

  • Gelöscht / Nicht gelöscht
  • 50/50
  • 10/90
  • 1/99

Ergebnisse - 50/50

Ergebnisse - 10/90

Ergebnisse - 1/99

Datenbankskripte, als Referenz, Beispiel, DeletedExample und Index für Example.IsDeleted

%Vor%     
Jon Raynor 13.01.2012, 20:15
quelle

2 Antworten

8

Die Zahlen, die Sie angegeben haben scheinen, dass mein erster Eindruck korrekt war: wenn Ihre häufigste Abfrage für diese Datenbank ist Um nach IsDeleted = 0 zu filtern, ist die Leistung mit einem einfachen Bit-Flag besser, besonders wenn Sie Indizes sinnvoll einsetzen.

Wenn Sie häufig gelöschte und nicht gelöschte Daten separat abfragen, können Sie eine Leistungssteigerung feststellen, wenn Sie eine Tabelle für gelöschte Objekte und eine weitere für nicht gelöschte Objekte mit identischen Feldern erstellen. Die Denormalisierung Ihrer Daten ist jedoch selten eine gute Idee, da Sie die Kosten für die Codewartung meist viel mehr kosten als die Performance-Steigerung.

    
StriplingWarrior 13.01.2012, 21:15
quelle
1

Ich bin nicht der SQL-Experte, aber meiner Meinung nach hängt alles von der Nutzungshäufigkeit der Datenbank ab. Wenn auf die Datenbank durch die große Anzahl von Benutzern zugegriffen wird und effizient sein muss, dann ist die Verwendung einer separaten isDeleted-Tabelle gut. Die bessere Option wäre die Verwendung eines Flags während der Produktionszeit und als Teil der täglichen / wöchentlichen / monatlichen Wartung können Sie alle gelöschten Datensätze in die Tabelle "isDeleted" verschieben und die Produktionstabelle der gelöschten gelöschten Datensätze löschen. Die Mischung beider Optionen wird gut sein.

    
blackwind 13.01.2012 20:32
quelle