我们有下表:
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表经常用于替换优惠券和插入新的优惠券。底线是,我们不希望我们的客户赎回一张优惠券,一直等到他们放弃或者其他程序失败。那么,从效率的角度来看,你认为哪种选择最好,为什么呢?
发布于 2010-08-25 20:02:19
我会选择过滤索引..。您正在存储相同的数据,因此将其保存在同一个表中。
当您可能不需要表并增加复杂性时,拆分表就是重构。
你对400万行有问题吗?特别是在这么窄的桌子上
发布于 2010-08-25 20:08:54
couponcode为空,这意味着某人可能会意外地创建一个记录,当它应该是一个有效的耦合代码时,该值为空
我会创建一个表示为非优惠券的couponcode,而不是求助于指示列"isCoupon“或"isNonCouponCampaign",并使用过滤后的索引来忽略"nocoupon”值。
这就引出了我的下一个观点--我没有看到外键引用,但这将是知道存在哪些优惠券以及哪些优惠券被实际使用的关键。现有表中的某些列可以移动到父耦合代码表.
https://stackoverflow.com/questions/3569709
复制相似问题