【发布时间】:2012-08-12 02:36:34
【问题描述】:
我有一个使用uniqueidentifier 作为聚集主键的SQL Server 表。创建表并插入几行后,我重新启动了服务器。该列使用NEWSEQUENTIALID() 作为其默认值。
但是,在重新启动后,下一次插入创建了一个 GUID 值低于之前值的行,导致它出现在 SELECT * 语句的顶部。
我的问题:在使用 GUID 类型的聚集主键时,有什么方法可以防止洗牌(AKA 保留行的顺序)?
【问题讨论】:
-
简而言之:没有。这些 GUID 充其量是伪顺序的,而且最肯定的是在 SQL Server 服务停止并重新启动之后,就不再有任何保证了。无论如何,作为 PK 的 GUID 是一个非常糟糕的选择 - 我会研究
INT IDENTITY,它在性能方面要好得多,并且这些值由 SQL Server 保证,并且会不断增加 - 即使在服务器重新启动后也是如此。 -
这里有描述(可能还有数百个其他地方,这只是第一个有用的搜索结果):sqltrends.blogspot.com/2011/04/…
-
无订单。没有什么可订购的,因为它是一个用户帐户列表,只有用户名和 oauth 令牌。但是,仍然首选时间顺序。
-
没有
ORDER BY的TOP (x)是毫无意义的——你得到what 前10 行?如果它们不是按某些东西排序的 - 你希望看到哪 10 行?? -
@marc_s 插入的前 10 行(添加的最早的 10 个帐户)。
标签: sql sql-server indexing guid uniqueidentifier