我有一个带有自然5列主键的表,但我想将该主键更改为唯一键,并且我想添加一个自动增量整数集群主键。
我可以只添加ID列+群集PK,还是ID列始终是表的第一列?我知道只是添加会有效,但我担心性能问题。
如果ID列应该是第一个,那么我必须进行数据迁移。
答案 0 :(得分:2)
在逻辑上定义PK列的位置并不重要。但是,将其作为聚簇索引始终将列(物理上)放在"开头"因为索引本身就成了表格,但这仍然不会影响性能,就像数据类型和数据的排序一样。
引用来自"开始SQL Server 2008 for Developers"作者:Robin Dewson
如前所述,聚簇索引实际上将数据保存在 表格按特定顺序排列。指定列(或多个列时) 列)作为聚簇索引,在插入记录时,SQL Server 将该记录置于实际位置以保持记录 正确的升序或降序对应于 在索引中定义的顺序。如果有的话,进一步解释一下 客户编号的聚集索引;和目前的数据 客户编号10,6,4,7,2和5;那么SQL Server会 按以下顺序物理存储数据:2,4,5,6,7,10。 如果一个流程然后添加一个客户编号9,它将是物理的 插入7到10之间,这可能意味着客户的记录 10号需要物理移动。因此,如果你已经定义了一个 数据插入的列或一组列上的聚簇索引 导致聚簇索引被重新排序,这将极大地影响 你的插入性能。 SQL Server确实提供了一种减少的方法 通过允许在a时指定填充因子来重新排序影响 索引已创建。
这是一个有趣的阅读,有关该主题的更多信息 http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-record/
答案 1 :(得分:1)
将此添加为评论,认为它可能是一个答案(至少在更好的一个出现之前)
就像@juergend所说的那样,PK不是第一列的必要条件。我目前正在开发一个数据库,其中PK总是在表的末尾。虽然这有效,但我发现当PK位于前端时,它有助于可视化数据。这可能只是个人偏好,您(和您的雇主)必须决定迁移是否值得付出努力。 PK的序数位置根本没有触及性能
答案 2 :(得分:1)
只有一个聚类键可能。在大多数情况下,PK默认为聚簇密钥(但您可以将PK定义为未聚集)。
区别:群集密钥会创建行的物理顺序。
你永远不应该为聚类选择一个列,其中插入不是隐式顺序(最差 - 但很常见 - 是UNIQUEIDENTIFIER
)。即使其他索引尝试使用(性能不佳)聚簇索引作为查找,这也会导致碎片错误和性能不佳。
您尝试引入自动增量列以扮演群集查找的角色 - 当然! - 一个好主意(只要你不想允许离线插入......)。
问题: