ID列应该是表的第一列吗?

时间:2016-04-18 09:40:25

标签: sql-server primary-key

我有一个带有自然5列主键的表,但我想将该主键更改为唯一键,并且我想添加一个自动增量整数集群主键。

我可以只添加ID列+群集PK,还是ID列始终是表的第一列?我知道只是添加会有效,但我担心性能问题。

如果ID列应该是第一个,那么我必须进行数据迁移。

3 个答案:

答案 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)。即使其他索引尝试使用(性能不佳)聚簇索引作为查找,这也会导致碎片错误和性能不佳。

您尝试引入自动增量列以扮演群集查找的角色 - 当然! - 一个好主意(只要你不想允许离线插入......)。

问题:

  • 不,列的位置并不重要。
  • 因为只有一个聚类键,你必须删除现有的(并将其重新创建为唯一的,但非聚集索引)
  • 您应该在新索引存在后重新创建所有其他索引,因为它们将使用您的新群集密钥作为查找。