如果主键始终排序,我如何以随机顺序将Guids存储为主键。
答案 0 :(得分:2)
不,表数据并不总是按主键的顺序存储,但通常主键具有聚簇索引,并且数据始终按聚簇索引的顺序存储。
如果您不希望数据按主键的顺序存储,则应使用非聚集索引。
请注意,尽管您通常按照存储顺序获取数据,但除非您使用order by
子句,否则无法保证顺序。如果订单非常重要,您应该始终指定它应该是什么。
答案 1 :(得分:1)
那么,主键并不一定按照磁盘上的排序顺序存储。但聚簇索引是。在绝大多数情况下,主键是聚簇索引。虽然这并不一定能保证结果的排序,但结果通常是默认情况下按聚簇索引排序。
如何以随机顺序存储Guids作为主键
由于这个原因,GUID不会为良好的聚簇索引做出贡献。 SQL Server确实有一个名为Sequential GUID的东西来解决这个问题。生成的GUID不会连续,但它们将是连续的。但它有一些警告:
创建一个GUID,该GUID大于自Windows启动以来指定计算机上此函数以前生成的任何GUID 。
如果系统重新启动,则序列将丢失。如果多个系统创建密钥,则序列将丢失。此外,还有一个问题是我们仍然依赖SQL Server来生成密钥,这种情况会失败使用GUID的重要原因。
一般情况下,我建议不要将GUID用作聚簇索引。作为替代方案,可以使用普通IDENTITY
密钥作为聚簇索引并创建单独的GUID列(可能具有自己的索引,甚至是唯一的约束,以确保应用程序不会尝试重新插入现有记录)。这个单独的列成为一种全局标识符"在更多的业务逻辑意义上,而不是在数据持久性实现意义上。
答案 2 :(得分:1)
没有主键并不总是按排序顺序存储。
聚集索引也不总是按排序顺序存储,与普遍的误解相反。
如果您选择随机GUID作为群集主键,那么很可能很快会得到一个高度分散的聚簇索引,其中物理和逻辑顺序在页面变满并且需要拆分时会发生很大差异。
通常,大多数聚簇索引扫描通过遵循页面指针而不是分配(页码)顺序以逻辑(索引键)顺序发生。为了考虑分配有序扫描,您必须以读取未提交的隔离级别运行,或者必须保持表锁定。
然而,如果没有订单,则无法保证结果的顺序。