我经常看到主键是唯一标识符类型的数据库。
将这些表连接在一起时,这种数据类型是否会影响查询性能?
为什么更喜欢uniqueidentifier而不是integer?
甚至 SQL 如何在 JOIN 子句中表示唯一标识符,它是像具有特定长度的varchar还是有其他表示?
我经常对这种数据类型感到困惑,为什么要使用以及性能有多难......
谢谢!
我经常看到主键是唯一标识符类型的数据库。
将这些表连接在一起时,这种数据类型是否会影响查询性能?
为什么更喜欢uniqueidentifier而不是integer?
甚至 SQL 如何在 JOIN 子句中表示唯一标识符,它是像具有特定长度的varchar还是有其他表示?
我经常对这种数据类型感到困惑,为什么要使用以及性能有多难......
谢谢!
来自MSDN的相当冗长(但仍然值得一读)的描述:
是一个 16 字节的 GUID。
它的缩进是全局唯一的,也就是说,您可能很确定,与整数不同,它在数据库(或宇宙中的其他任何地方)中是唯一的,而不仅仅是在表的记录中。
整数是 4 个字节,因此 GUID 上的连接可能会稍微慢一些。但是,在现实世界的场景中,您将拥有比这更多的数据,因此,这通常不是您担心的事情。
也可以创建索引uniqueidentifier
。
假设您要连接的字段在连接所涉及的两个表中都有适当的索引,则将唯一标识符作为连接条件应该与整数一样快地执行 almsot。整数通常会更快,但在大多数现实世界的场景中,这不会有任何区别。
然而,使用唯一标识符作为表中的主键还有另一个问题,因为它会创建页面碎片,因为底层数据页面具有以随机顺序插入的数据,并且聚集索引上的主键(sql server 默认)将希望以字典顺序存储它们会发现困难,因为可以在数据页中的任何位置使用值创建新索引,而不是通常是顺序和递增的 int。
我的建议是使用代理主键作为整数(必要时为大整数),并将唯一标识符作为表中具有适当覆盖索引的另一列。