現在、完全に機能する既存のデータベースとアプリケーションがあります。この時点でアーキテクチャを変更することはできません。今日、データベース内の各テーブルには、「IsDeleted」NOT NULL BITフィールドがあり、デフォルトは「0」です。アプリケーションがデータを「削除」すると、IsDeletedフラグが1に更新されます。
私が理解できないのは、各テーブルのインデックスの構成方法です。現在、すべてのquery / join / etcは常にIsDeletedチェックを実装しています。開発者が従わなければならない標準です。そうは言っても、各テーブルのクラスター化プライマリキーインデックスをすべて変更して、プライマリキーとIsDeleted BITフィールドを含める必要があるかどうかを判断しようとしています。また、すべてのquery / join / etcから。IsDeletedチェックを実装する必要がありますが、すべての単一のインデックス(非クラスター化)がIsDeletedフィールドをインデックスの最初のフィールドとして含むべきであるという適切な仮定ですか?
もう1つの質問は、フィルター選択されたインデックスに関するものです。「WHERE IsDeleted = 0」などのインデックスにフィルターを適用して、インデックスのサイズを小さくできることを理解しています。ただし、すべての結合/クエリはIsDeletedチェックを実装する必要があるため、(結合/クエリでIsDeleted列が使用されるため)フィルター選択されたインデックスが使用されないようにしますか?
私は、IsDeletedアプローチを変更する能力がないことを忘れないでください。
IsDeleted
列の遍在性と重要性を考えると、物理ストレージに関係なく、2つのビュー(オプションで異なるスキーマ)を介してデータを公開し、パラメーター化の問題を解決し、本来あるべきではないデータにアクセスする際にミスを犯すことはおそらく意味がありますアクセスされる可能性は低い。基本データへのアクセスは、削除されたデータと削除されていないデータを何らかの方法で組み合わせる必要があり、実際に行を「削除済み」に切り替える必要がある場合にのみ関連します。