主键是按排序顺序存储还是仅按SQL语句排序?

时间:2014-10-03 19:06:37

标签: sql sql-server guid

如果主键始终排序,我如何以随机顺序将Guids存储为主键。

3 个答案:

答案 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作为群集主键,那么很可能很快会得到一个高度分散的聚簇索引,其中物理和逻辑顺序在页面变满并且需要拆分时会发生很大差异。

通常,大多数聚簇索引扫描通过遵循页面指针而不是分配(页码)顺序以逻辑(索引键)顺序发生。为了考虑分配有序扫描,您必须以读取未提交的隔离级别运行,或者必须保持表锁定。

然而,如果没有订单,则无法保证结果的顺序。