【问题标题】:Add Clustered Index to Table with Non-Clustered Unique PK Index将聚集索引添加到具有非聚集唯一 PK 索引的表
【发布时间】:2015-10-13 02:03:44
【问题描述】:

我有一个现有的表结构:

TableA
(
    Id1 int not null,
    Id2 int not null
)

其中主键是复合(Id1, Id2)。如果你还没有推导出来,这是一个多对多关联表。这些是表中唯一的列。

由于此实例中业务用例的性质,填充表的实际应用程序数据只是一对多关系。行数非常少。某处〜50行。有时会创建新的 Id2 记录,然后将其关联到现有的 Id1 记录。更罕见的是,会创建需要插入一组新的 Id1, Id2 记录的新 Id1 记录。然而,在日常基础上,数据是静态的。该表在连接查询中大量使用。

表上的唯一索引是(Id1, Id2) 上的nonclustered, unique, primary key(作为约束定义的一部分创建)。

为了满足同步数据到另一个数据库的一些需求,我需要给这个表添加一个聚集索引。

在保持最佳性能和良好的物理数据组织的同时,最好的方法是什么?

鉴于行数较少,我倾向于用聚集索引替换非聚集索引。

一些想法:

  • 由于表中没有其他列,因此无法在任何其他列上添加聚集索引。
  • 只在一列上添加聚集索引没有意义,而且可能是有害的。
  • 在同一列上同时使用聚集索引和非聚集索引会不会很痛苦?
  • 由于实际数据是一对多的,没有利用多对多的结构,所以用聚集索引代替非聚集索引也不错。
  • 将数据插入 PK 列上的聚集索引会导致物理数据组织错误。
  • 向表中添加标识列并在其上放置聚集索引可以解决此问题,但对查询没有任何好处。
  • 我可能过度分析了这一点。

【问题讨论】:

    标签: sql-server indexing sql-server-2012


    【解决方案1】:

    我会说,50 行并不重要。我会创建一个

    • (id1, id2) 上的聚集索引(主键)
    • 加上(id2, id1) 上的非聚集唯一索引

    这将涵盖所有可能的查询。

    偶尔(每天或每周一次,或在更改此不经常更改的表之后)您可以重建所有索引以对它们进行碎片整理并保持统计信息最新。应该以任何方式对所有表进行这种维护。

    【讨论】:

    • 我将主键索引替换为集群索引。我喜欢涵盖反向选择 PK 字段的非聚集索引。也添加了那个。一天后回顾这个问题:完全过度分析了。
    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 2014-11-04
    • 2013-08-07
    • 1970-01-01
    • 2012-12-30
    • 2011-04-05
    • 2021-12-14
    相关资源
    最近更新 更多