Sql server 对于这种情况,哪种方法更好?
我们有下表:Sql server 对于这种情况,哪种方法更好?,sql-server,sql-server-2008,unique-index,Sql Server,Sql Server 2008,Unique Index,我们有下表: 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] [da
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万条记录,而且还在增长。我们还开展不需要优惠券代码的活动,因此我们不插入这些记录。现在,我们还需要开始跟踪这些活动,还有另一个目的。因此,我们有两种选择:
请记住,活动客户表经常用于兑换优惠券和插入新优惠券。底线是,我们不希望我们的客户兑换优惠券并等待他们放弃或其他流程失败。那么,从效率的角度来看,你认为哪种选择是最好的,为什么 我会选择过滤索引。。。您正在存储相同的数据,因此请将其保存在同一个表中 当您可能不需要拆分表并增加复杂性时,拆分表就是重构
400万行有问题吗?特别是对于这样一个狭窄的表来说,这并没有什么大不了的。我会选择过滤索引。。。您正在存储相同的数据,因此请将其保存在同一个表中 当您可能不需要拆分表并增加复杂性时,拆分表就是重构 400万行有问题吗?对于这么窄的桌子来说没什么特别的
couponcode
为null意味着有人可能会意外地创建一个记录,其中值为null,而该值应该是有效的couponcodecouponcode
,指示为非优惠券,而不是求助于指标列“isCoupon”或“isNonCouponCampaign”,并使用过滤索引忽略“nocoupon”值
这就引出了我的下一点——我没有看到外键引用,但它将是了解优惠券存在和实际使用优惠券的关键。现有表中的某些列可以上移到父couponcode表中
couponcode
为null意味着有人可能会意外地创建一个记录,其中值为null,而该值应该是有效的couponcodecouponcode
,指示为非优惠券,而不是求助于指标列“isCoupon”或“isNonCouponCampaign”,并使用过滤索引忽略“nocoupon”值
这就引出了我的下一点——我没有看到外键引用,但它将是了解优惠券存在和实际使用优惠券的关键。现有表中的某些列可以上移到父couponcode表…有多少没有couponcode的营地(以百分比表示)?16.5%的活动没有优惠券代码。根据这个比率,我会选择选项1。但是,我将使用一个表示无优惠券记录的伪代码,而不是null。你可能会想到分区表…有多少没有CouponCode的营地(百分比)?16.5%的活动没有优惠券代码。根据这个比率,我会选择选项1。但是,我将使用一个表示无优惠券记录的伪代码,而不是null。您可能会想到分区表……我们现在对400万行没有问题。我们什么时候开始担心桌子的大小?我们不打算存储相同的数据,而是类似的数据。我们现在对400万行没有问题。我们什么时候开始担心桌子的大小?我们不会存储相同的数据,而是类似的数据。那么,你是说不要使用NULL,只需插入“nocoupon”并过滤该数据上的唯一密钥?@Jonas Stawski:是的。我忘了它会被复制并打破了您的唯一约束。@Jonas Stawski:是的,但是空值比明确说明记录不同原因的定义值更糟糕。那么,您是说插入“nocoupon”而不是使用空值,并在其上过滤唯一键?@Jonas Stawski:是的。我忘了它会被复制&这打破了您的唯一约束。@Jonas Stawski:是的,但是空值比明确说明记录不同原因的定义值更糟糕。