Derzeit verfügen wir über eine Datenbank und eine Anwendung, die voll funktionsfähig sind. Ich habe nicht die Möglichkeit, die Architektur zu diesem Zeitpunkt zu ändern. Heute hat jede Tabelle in der Datenbank ein Feld "IsDeleted" NOT NULL BIT mit dem Standardwert "0". Wenn die Anwendung Daten "löscht", aktualisiert sie einfach das IsDeleted-Flag auf 1.
Ich habe Probleme zu verstehen, wie die Indizes für jede der Tabellen strukturiert sein sollten. Im Moment implementiert jede Abfrage / Verknüpfung / etc immer die IsDeleted-Prüfung. Es ist ein Standard, dem unsere Entwickler folgen müssen. Davon abgesehen versuche ich festzustellen, ob alle meine gruppierten Primärschlüsselindizes für jede der Tabellen geändert werden müssen, um den Primärschlüssel UND das Feld IsDeleted BIT einzuschließen. Da JEDE Abfrage / Verknüpfung / etc. Muss die IsDeleted-Prüfung implementiert werden? Ist es eine angemessene Annahme, dass JEDER EINZELNE Index (auch nicht geclustert) das IsDeleted-Feld als erstes Feld des Index enthalten sollte?
Eine andere Frage, die ich habe, betrifft gefilterte Indizes. Ich verstehe, dass ich Filter auf die Indizes wie "WHERE IsDeleted = 0" setzen könnte, um die Größe der Indizes zu reduzieren. Würde dies jedoch die Verwendung des gefilterten Index verhindern, da jeder Join / jede Abfrage die IsDeleted-Prüfung implementieren muss (da die IsDeleted-Spalte in Join / Abfrage verwendet wird)?
Denken Sie daran, dass ich den IsDeleted-Ansatz nicht ändern kann.
IsDeleted
Spalte ist es unabhängig vom physischen Speicher wahrscheinlich sinnvoll, die Daten in zwei Ansichten (optional in verschiedenen Schemata) bereitzustellen, um sowohl das Parametrisierungsproblem zu lösen als auch Fehler beim Zugriff auf Daten zu machen, die nicht hätten sein dürfen weniger wahrscheinlich zugegriffen. Der Zugriff auf die Basisdaten ist nur in den seltenen Fällen relevant, in denen gelöschte und nicht gelöschte Daten kombiniert werden müssen und wenn die Zeilen tatsächlich auf "gelöscht" geschaltet werden müssen.