我将在一个相当大的表中添加一个聚集索引:
- 超过 700 万条记录
- 106 列
- 没有PK
- 没有其他索引。
有一Id
列可能用于索引键,但它是nvarchar(18)
and not unique
(尽管那里没有重复值)。
但是,由于它的数据类型(性能影响),我不愿意使用它,并且一直在考虑添加一int identity(1,1)
列并将其用作聚集索引键。
您更愿意推荐哪种解决方案?TIA
我将在一个相当大的表中添加一个聚集索引:
有一Id
列可能用于索引键,但它是nvarchar(18)
and not unique
(尽管那里没有重复值)。
但是,由于它的数据类型(性能影响),我不愿意使用它,并且一直在考虑添加一int identity(1,1)
列并将其用作聚集索引键。
您更愿意推荐哪种解决方案?TIA
一般来说,代理 ID(一个没有任何其他含义的递增数字)是最佳选择,除非您有特定的原因说明它不起作用。
对主键使用非递增值的最大问题之一是您将在某些插入上进行页面拆分,这将导致它们变慢。慢多少取决于很多因素,所以这只是你必须在系统上测量的东西。
谷歌“代理主键的好处”,你会发现大量的信息。这确实是一本涵盖该主题的小书,因此完整的答案并不适合该站点。 这个问题也有一些答案可以提供关于这个主题的很好的信息。
是的,这是一种方法
为什么 - 请阅读以下内容:
良好聚集索引的要求:
1) 不断增加
这将有助于减少未来的索引碎片
2) 唯一
如果聚集索引键行不唯一,SQL Server 会自动添加额外的隐藏 INT 唯一符(4 字节)以使聚集索引键唯一,这会增加聚集索引和非聚集索引(它们也受聚集索引宽度的影响,因为它们包含聚集索引键的隐藏副本)
3) Narrow
选择尽可能小的数据类型,因为它再次增加了存储和 RAM 需求,并降低了性能
这就是为什么
Id nvarchar(18)
您拥有的不是聚集索引键的候选者,所以继续添加 INT identity(1,1) 列