Sql 带int-Clustered的uniqueidentifier PK:使用哪个作为外键?
我已经看过很多文章指出使用以下模式:Sql 带int-Clustered的uniqueidentifier PK:使用哪个作为外键?,sql,sql-server,Sql,Sql Server,我已经看过很多文章指出使用以下模式: ID(uniqueidentifier):主键,非集群 clusteredd(int):索引,聚集(标识) 我的其他专栏(各种) 我对这种模式的解释是,它允许使用uniqueidentifier(这在许多情况下都很有用)来标识记录,但这意味着聚集索引不会变得如此分散,因为生成的int identity列值的递增顺序 到目前为止,这一切对我来说都是有意义的 我不完全理解的是: 如果唯一标识符是uniqueidentifier,那么在相关表中将其用作FK是有
(ID
):主键,非集群uniqueidentifier
(clusteredd
):索引,聚集(标识)int
- 我的其他专栏(各种)
uniqueidentifier
(这在许多情况下都很有用)来标识记录,但这意味着聚集索引不会变得如此分散,因为生成的int identity
列值的递增顺序
到目前为止,这一切对我来说都是有意义的
我不完全理解的是:
如果唯一标识符是uniqueidentifier
,那么在相关表中将其用作FK是有意义的。现在,当执行连接两个表的select语句时,SQL Server
将对uniqueidentifiers
执行连接。然而,由于实际上是int索引进行了聚集,因此我认为在int上进行聚集不会有助于连接的性能
如果我上面的假设是正确的,那么我并不欣赏添加聚集整数索引的好处
因此,我想我的假设是不正确的。有人能告诉我我的想法哪里出了问题吗?可以找到对该主题的详细描述-使用GUID作为主键的最佳实践是什么…对您的问题的正确解释与往常一样:这取决于。首先:为什么不引用子表中的
ClusteredD
?您完全可以这样做-因为它是一个INT-IDENTITY
列,所以您可以轻松地在它上面放置一个唯一聚集索引
,从而将其用于FK约束。第二:由于ID
列上有一个索引,因此联接将尽可能高效。我看不出有任何负面影响。。。是的,ID
并没有决定物理表的结构,但是ID
上的索引仍然提供了一个顺序(当然,只是索引列),这有助于JOINsIt不是一个“隐藏”表-每个非聚集索引也只包含叶级的集群键。因此,当你在非聚集索引中找到一个条目时,你也总是可以使用它的聚集键来访问实际的数据页。@marc_s-你最后的一条小评论是值得的!谢谢