論理的な削除にフラグを使用する必要がありますか、それとも別の結合テーブルを使用する必要がありますか? どちらがより効率的ですか? データベースは SQL Server です。
背景情報
しばらく前に、DB コンサルタントが来て、データベース スキーマを調べました。レコードをソフト削除すると、適切なテーブルの IsDeleted フラグが更新されます。フラグを使用する代わりに、削除されたレコードを別のテーブルに保存し、結合を使用することをお勧めします。私はその提案をテストしましたが、少なくとも表面的には、余分なテーブルと結合はフラグを使用するよりも高価に見えます。
初期テスト
このテストを設定しました。
Example と DeletedExample の 2 つのテーブル。IsDeleted 列に非クラスター化インデックスを追加しました。
次の削除された/削除されていない比率で 100 万件のレコードをロードして、3 つのテストを行いました。
- 削除済み/非削除済み
- 50/50
- 10/90
- 1/99
結果 - 50/50
結果 - 10/90
結果 - 1/99
データベース スクリプト、参照用、例、DeletedExample、および Example.IsDeleted のインデックス
CREATE TABLE [dbo].[Example](
[ID] [int] NOT NULL,
[Column1] [nvarchar](50) NULL,
[IsDeleted] [bit] NOT NULL,
CONSTRAINT [PK_Example] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Example] ADD CONSTRAINT [DF_Example_IsDeleted] DEFAULT ((0)) FOR [IsDeleted]
GO
CREATE TABLE [dbo].[DeletedExample](
[ID] [int] NOT NULL,
CONSTRAINT [PK_DeletedExample] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[DeletedExample] WITH CHECK ADD CONSTRAINT [FK_DeletedExample_Example] FOREIGN KEY([ID])
REFERENCES [dbo].[Example] ([ID])
GO
ALTER TABLE [dbo].[DeletedExample] CHECK CONSTRAINT [FK_DeletedExample_Example]
GO
CREATE NONCLUSTERED INDEX [IX_IsDeleted] ON [dbo].[Example]
(
[IsDeleted] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO