Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 对于这种情况,哪种方法更好?_Sql Server_Sql Server 2008_Unique Index - Fatal编程技术网

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万条记录,而且还在增长。我们还开展不需要优惠券代码的活动,因此我们不插入这些记录。现在,我们还需要开始跟踪这些活动,还有另一个目的。因此,我们有两种选择:

  • 我们将CouponCode列更改为allownulls,并创建一个唯一的文件索引,以不包含nulls,并允许表增长得更大更快
  • 为此特定目的创建一个单独的表,用于跟踪所有活动

  • 请记住,活动客户表经常用于兑换优惠券和插入新优惠券。底线是,我们不希望我们的客户兑换优惠券并等待他们放弃或其他流程失败。那么,从效率的角度来看,你认为哪种选择是最好的,为什么

    我会选择过滤索引。。。您正在存储相同的数据,因此请将其保存在同一个表中

    当您可能不需要拆分表并增加复杂性时,拆分表就是重构


    400万行有问题吗?特别是对于这样一个狭窄的表来说,这并没有什么大不了的。

    我会选择过滤索引。。。您正在存储相同的数据,因此请将其保存在同一个表中

    当您可能不需要拆分表并增加复杂性时,拆分表就是重构

    400万行有问题吗?对于这么窄的桌子来说没什么特别的

  • 为了一列,我反对重复表
  • 允许
    couponcode
    为null意味着有人可能会意外地创建一个记录,其中值为null,而该值应该是有效的couponcode
  • 我将创建一个
    couponcode
    ,指示为非优惠券,而不是求助于指标列“isCoupon”或“isNonCouponCampaign”,并使用过滤索引忽略“nocoupon”值

    这就引出了我的下一点——我没有看到外键引用,但它将是了解优惠券存在和实际使用优惠券的关键。现有表中的某些列可以上移到父couponcode表中

  • 为了一列,我反对重复表
  • 允许
    couponcode
    为null意味着有人可能会意外地创建一个记录,其中值为null,而该值应该是有效的couponcode
  • 我将创建一个
    couponcode
    ,指示为非优惠券,而不是求助于指标列“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:是的,但是空值比明确说明记录不同原因的定义值更糟糕。