概念检查:
根据我的理解,主键中的列顺序(基本上是聚集索引)应根据清晰度See here)确定
但我没有看到任何明确提及实际表中的列顺序与主键之间的相关性。
或者换句话说,如果PK中列的最佳顺序为(B, C, A)
,如果表中的列的顺序为A,B,C,则会产生任何性能影响(即不同于PK定义)?
create table ABC (
A int,
B varchar(10),
C int)
我对SQL Server 2005的体验似乎表明无关紧要
答案 0 :(得分:3)
表中列的“顺序”是表定义方式的工件 - 关系数据库的一个关键概念是列按名称而不是按顺序位置定位。
数据库中列的实际布局可能与您给出的顺序不匹配 - 例如,如果在表上定义了多个位列,则每组8个将打包成一个字节,不它们出现在表格定义中的位置。
另一个例子,所有固定长度的列都在行的开头打包。因此,在您的示例ABC
表中,磁盘上每行的列顺序实际上是A
,C
,B
(但是之前还出现了一些其他结构列A
以及C
和B
之间。
简而言之,不,表中列的顺序不应有任何影响。
您还可以找到大量examples of questions on SO,其中人们要求在表格中的特定位置插入列,并给出类似的答案 - 列在表定义中出现的位置无关紧要 - 重要的是列出现在选择列表中,正如您所提到的,在索引定义中。
您也不应该将主键和聚簇索引混为一谈 - 两者不必捆绑在一起。如果尚未定义聚簇索引,那么主键将成为表上的聚簇索引的默认行为。
答案 1 :(得分:3)
主键是属性的集。原则上,密钥的属性没有顺序。遗憾的是,SQL Server使用在密钥创建语法中指定列名的顺序来确定支持该密钥的索引中的列的顺序。所以你必须考虑指定的排序,就像考虑索引中列的顺序一样。
主键与聚簇索引不同。 SQL Server需要索引来支持键约束,但您可以指定索引是聚簇索引还是非聚簇索引。
答案 2 :(得分:2)
没关系,没有意义(不同的顺序)