我们有下表:
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万条记录并且还在增长。我们还开展不需要优惠券代码的广告系列,因此我们不会插入这些记录。现在,我们还需要开始跟踪这些广告系列以达到其他目的。所以我们有两个选择:
请注意,CampaignCustomer表经常用于兑换优惠券和插入新优惠券。最重要的是,我们不希望我们的客户兑换优惠券并等待他们放弃或其他流程失败。那么,从效率的角度来看,您认为哪种选择最好,为什么?
答案 0 :(得分:4)
我会选择过滤后的索引...你要存储相同的数据,所以请将它保存在同一个表中。
当你可能不需要时,拆分表就是重构,并增加了复杂性。
你有400万行的问题吗?对于如此狭窄的表格而言,这并不是那么多。
答案 1 :(得分:2)
couponcode
为null意味着有人可能会意外地创建一个值为NULL的记录,当它应该是有效的优惠券时我会创建一个couponcode
来表示非优惠券,而不是使用指标列“isCoupon”或“isNonCouponCampaign”,并使用过滤后的索引来忽略“nocoupon”值。
这导致我的下一个观点 - 我没有看到外键引用,但知道哪些优惠券存在以及实际使用哪些优惠券是关键。现有表中的某些列可以移动到父优惠券表...