使用非聚集的唯一PK索引将聚簇索引添加到表中

时间:2015-07-22 23:55:20

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

我有一个现有的结构表:

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

主键是复合(Id1, Id2)。如果你还没推断出它,那么这是一个多对多的关联表。这些是表中唯一的列。

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

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

为了满足将数据同步到另一个数据库的一些要求,我需要在此表中添加聚簇索引。

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

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

一些想法:

  • 由于表中没有其他列,因此无法在任何其他列上添加聚簇索引。
  • 仅在一列上添加聚集索引并不合理,可能会有害。
  • 在同一列上同时拥有聚簇索引和非聚集索引会不会很麻烦?
  • 由于实际数据是一对多且不使用多对多结构,因此用聚簇索引替换非聚集索引并不错。
  • 数据插入PK列上的聚簇索引会导致不良的物理数据组织。
  • 向表中添加标识列并在其上放置聚簇索引可以解决问题,但根本不会对查询产生任何好处。
  • 我可能过度分析了这一点。

1 个答案:

答案 0 :(得分:2)

我说,有50行它并不重要。我创建了一个

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

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

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