SQL Server - 在大堆中创建聚集索引 - 我应该添加一列吗?

Tim*_*ero 3 sql-server clustered-index

我将向一个相当大的表添加一个聚集索引:

  • 超过 700 万条记录
  • 106列
  • 没有PK
  • 没有其他索引。

有一Id列可能用于索引键,但它是nvarchar(18)not unique(尽管那里没有重复值)。

但是我不愿意使用它,因为它的数据类型(性能影响)并且一直在考虑添加一int identity(1,1)列并将其用作聚集索引键。

您更愿意推荐哪种解决方案?TIA

Ton*_*kle 6

通常,代理 ID(没有任何其他含义的递增数字)是最佳选择,除非您有特定的原因使其不起作用。

对主键使用非递增值的最大问题之一是您将在某些插入上进行页面拆分,这将导致它们变慢。慢多少取决于很多因素,所以这只是你必须在系统上测量的东西。

谷歌“代理主键的好处”,你会发现大量的信息。这确实是一本涵盖该主题的小书,因此完整的答案并不适合该网站。 这个问题也有一些答案,提供了关于这个主题的很好的信息。


Ale*_*sko 6

一直在考虑加一个INT identity(1,1)列,作为聚集索引键

是的,这是一种方法
为什么 - 请阅读以下内容:

良好聚集索引的要求:

1)不断增加
这将有助于减少未来的索引碎片

2) 唯一
如果聚集索引键行不唯一,SQL Server 会自动添加额外的隐藏 INT uniquifier(4 字节)以使聚集索引键唯一,这增加了聚集索引和非聚集索引(它们)的存储要求也受聚集索引宽度的影响,因为它们包含聚集索引键的隐藏副本)

3)Narrow
选择尽可能小的数据类型,因为它再次增加了存储和RAM要求,并降低了性能

这就是为什么Id nvarchar(18)您拥有的不是聚集索引键的不良候选者,所以继续添加 INT identity(1,1) 列