Sql server 将聚集索引添加到具有非聚集唯一主键索引的表中

Sql server 将聚集索引添加到具有非聚集唯一主键索引的表中,sql-server,indexing,sql-server-2012,Sql Server,Indexing,Sql Server 2012,我有一个具有以下结构的现有表: TableA ( Id1 int not null, Id2 int not null ) 其中主键是复合(Id1,Id2)。如果您还没有推导出它,这是一个多对多关联表。这些是表中唯一的列 由于本实例中业务用例的性质,填充表的实际应用程序数据只是一对多关系。行的数量非常少。大约50排。偶尔会创建新的Id2记录,然后将其与现有的Id1记录关联。甚至很少会创建新的Id1记录,需要插入一组新的Id1、Id2记录。然而,在日常基础上,数据是静态的。该表在

我有一个具有以下结构的现有表:

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

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

表上唯一的索引是
(Id1、Id2)
上的
非聚集、唯一、主键
(作为约束定义的一部分创建)

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

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

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

一些想法:

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

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

  • 上的聚集索引(主键)(id1,id2)
  • 加上
    上的非聚集唯一索引(id2,id1)
这将涵盖所有可能的查询


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

我将主键索引替换为集群索引。我喜欢包含PK字段反向选择的非聚集索引。他补充道。一天后回顾这个问题:完全过度分析了它。