2012-01-13 3 views
8

ソフト削除にフラグを使用するか、別の結合ツールテーブルを使用する必要がありますか?どちらがより効率的ですか?データベースはSQL Serverです。ソフト削除 - IsDeletedフラグを使用するか、別の結合テーブルを使用しますか?

背景情報

しばらくは戻って私たちはDBのコンサルタントが来て、私たちのデータベーススキーマを見ていました。レコードをソフト削除すると、適切なテーブルのIsDeletedフラグが更新されます。フラグを使用する代わりに、削除されたレコードを別のテーブルに格納し、より良いものとして結合を使用することを提案しました。私はその提案をテストに入れましたが、少なくとも表面的には余分なテーブルと結合は、フラグを使用してより高価に見えます。私はこのテストを設定した

初期テスト

ExampleとDeletedExampleの2つのテーブル。 IsDeleted列にノンクラスタード・インデックスを追加しました。

私は次のように削除/非削除比で万レコードをロードし、3つのテストをしました:

  • /削除NonDeleted
  • 50/50
  • 10/90
  • 1/99

結果 - 50/50 50 50

結果 - 10/90 10 90

結果 - 1/99 enter image description here

Example.IsDeleted

ための参考、例、DeletedExample、およびインデックス用の データベーススクリプト、
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 

答えて

8

数値がmy initial impressionであることを示しているようです。このデータベースに対する最も一般的なクエリがIsDeleted = 0にフィルタリングする場合は、特にインデックスを賢明に使用すると、単純なビットフラグでパフォーマンスが向上します。

削除されたデータと削除されていないデータを別々に照会すると、削除されたアイテムのテーブルと削除されていないアイテムのテーブルが同じフィールドで表示されるため、パフォーマンスが向上します。しかし、このようにデータを非正規化することは、コードのメンテナンスコストをパフォーマンス向上のために費やすよりもはるかに多くの費用がかかりますので、あまり良いことではありません。

+2

フィルターされた索引の使用も検討してください。レコードが削除されていないときに、Example1テーブルのみをColumn1でクエリすると、Index Column1 "WHERE IsDelete = 0"となります。 –

1

I私の意見では、それはすべてデータベースの使用頻度に依存しています。データベースが多数のユーザーによってアクセスされ、効率的である必要がある場合、分離されたisDeletedテーブルの使用は良いでしょう。より良いオプションは、プロダクション時にフラグを使用し、毎日/毎週/毎月のメインテナンスの一部として、ソフト削除されたすべてのレコードをisDeletedテーブルに移動し、ソフト削除されたレコードの生産テーブルをクリアすることができます。両方のオプションの混合は良い良いものになります。

関連する問題