主键是否应始终指定为聚簇索引

Abr*_*mJP 10 sql sql-server clustered-index

我有一个存储员工详细信息的SQLServer表,列ID是GUID类型,而EmployeeNumber列是INT类型.大多数时候,我会在加入和选择条件时处理EmployeeNumber.

我的问题是,在ClusteredIndex为EmployeeNumber时,将PrimaryKey分配给ID列是否合理?

Rem*_*anu 9

是的,可以拥有非群集主键,并且可以拥有与主键完全无关的群集密钥.默认情况下,主键也可以成为聚簇索引键,但这不是必需的.

主键是一个逻辑概念:是数据模型中用于引用实体的键.
聚集索引键是物理概念:是您希望将行存储在磁盘上的顺序.

选择不同的集群密钥是由多种因素驱动的,例如当您需要比主键更窄的集群密钥时的密钥宽度(因为集群密钥在每个非集群索引中被复制.或支持频繁范围扫描(常见于时间序列)当经常使用类似的查询访问数据时date between '20100101' and '20100201'(聚合索引键date将是合适的).

此主题之前已经讨论过这个问题,请参阅聚集索引应该放在哪一列?.


JNK*_*JNK 8

理想的聚簇索引键是:

  1. 顺序
  2. 选择性(没有欺骗,每个记录都是唯一的)
  3. 狭窄
  4. 用于查询

一般来说,将GUID用作聚簇索引键是一个非常糟糕的主意,因为它会在添加行时导致更多碎片.

编辑清晰度:

PK和Clustered键确实是单独的概念.您的PK不需要是您的聚集索引键.

在我自己的实际应用中,与PK相同的字段应该/将成为您的群集密钥,因为它符合上面列出的相同条件.

  • 我很确定声明"......你的PK将成为SQL服务器中的集群密钥......"并不完全正确.例如,聚簇索引可以基于唯一键.否则,我喜欢你的答案. (3认同)
  • 但是,如果需要全局唯一性的好处,则可以使用顺序GUID(NEWSEQUENTIALID)。 (2认同)