次の表があります。
CREATE TABLE [dbo].[CampaignCustomer](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CampaignID] [int] NOT NULL,
[CustomerID] [int] NULL,
[CouponCode] [nvarchar](20) NOT NULL,
[CreatedDate] [datetime] NOT NULL,
[ModifiedDate] [datetime] NULL,
[Active] [bit] NOT NULL,
CONSTRAINT [PK_CampaignCustomer] 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]
および次の一意のインデックス:
CREATE UNIQUE NONCLUSTERED INDEX [IX_CampaignCustomer_CouponCode] ON [dbo].[CampaignCustomer]
(
[CouponCode] 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, FILLFACTOR = 20) ON [PRIMARY]
GO
CouponCodeと他の外部キーを使用してかなり一定のクエリを実行します(簡単にするために上記には示されていません)。CampaignCustomerテーブルには、ほぼ400万件のレコードがあり、増え続けています。また、クーポンコードを必要としないキャンペーンも行っているため、これらのレコードは挿入されません。次に、別の目的のために、これらのキャンペーンの追跡も開始する必要があります。したがって、2つのオプションがあります。
- CouponCode列を変更してnullを許可し、nullを含まないように一意のファイラーインデックスを作成して、テーブルをさらに大きく高速に拡張できるようにします。
- この特定の目的のためにすべてのキャンペーンを追跡するための個別のテーブルを作成します。
CampaignCustomerテーブルは、クーポンの引き換えや新しいクーポンの挿入に頻繁に使用されることに注意してください。結論として、お客様がクーポンを利用して、あきらめるまで、または他のプロセスが失敗するまで待たされたくないということです。では、効率の観点から、どのオプションが最適だと思いますか、またその理由は何ですか?