UniqueIquenntifId上的NewSequentialId

时间:2011-08-04 15:32:49

标签: sql-server sql-server-2008 uniqueidentifier clustered-index newsequentialid

我正在研究我公司正在开始的新数据库的数据库标准。我们尝试定义的一件事是与UniqueIdentifiers相关的主键和聚簇索引规则。

(注意:我不想讨论使用UniqueIdentifier作为主键或聚簇索引的利弊。网上有大量关于此的信息。这是那个讨论。)

所以这是令我担心的情景:

假设我有一个带有UniqueIdentifier的表作为聚簇索引和主键。让我们称之为ColA。我将ColA的默认值设置为NewSequentialId()。

使用NewSequentialId()我插入三个连续的行:

{72586AA4-D2C3-440D-A9FE-CC7988DDF065}
{72586AA4-D2C3-440D-A9FE-CC7988DDF066}
{72586AA4-D2C3-440D-A9FE-CC7988DDF067}

然后我重启我的服务器。 docs for NewSequentialId表示“重新启动Windows后,GUID可以从较低范围重新开始,但仍然是全局唯一的。”

所以下一个起点可能低于前一个范围。

因此,重新启动后,我再插入3个值:

{35729A0C-F016-4645-ABA9-B098D2003E64}
{35729A0C-F016-4645-ABA9-B098D2003E65}
{35729A0C-F016-4645-ABA9-B098D2003E66}

(我不确定Guid是如何在数据库中表示的,但我们假设因为这个从3开始而前面的那些从7开始,3个是比7个小“。”

当您执行位于聚簇索引中间的插入时,必须重新映射索引。 (至少我的DBA告诉过我。)每次重新启动时,我都冒着将新的UniqueIdentifier范围放在其他先前范围中间的风险。

所以我的问题是:由于下一组UniqueIdentifier将小于最后一组,每个插入是否会导致我的聚簇索引混乱?

如果没有,为什么? SQL Server是否知道我正在使用NewSequentialId?这有什么可以弥补的吗?

如果没有,那么它如何知道接下来会插入什么?也许接下来的百万次插入将从3开始。或者他们将从7开始。它是如何知道的?

或者它不知道,只是保持一切顺序。如果是这种情况,则一次重启会严重影响性能。 (这让我觉得我需要自己的自定义NewSequentialId,它不会受到重启的影响。)这是正确的吗?还是有一些我不知道的魔法?

编辑:我的标准强烈建议不要将GUID作为聚集索引。正如我上面所说,有很多原因,这是一个坏主意。我试图找出这是否是另一个原因。

1 个答案:

答案 0 :(得分:1)

通常情况下,您将使用适当的FILL FACTOR创建索引,以便为所有页面留出空白区域。话虽这么说,一旦空白空间被填满,聚集索引就会被重新排序。

我知道您不想讨论使用GUID作为群集密钥,但这是不推荐做法的原因之一。

将会发生越来越多的页面拆分,当您继续插入行时,这将导致非常高级别的碎片,并且您需要以更高的频率重建索引以保持性能线。

对于该主题的完整处理,没有比

更好的来源

Kim
Tripp's
Blog

作为旁注,当您考虑创建自己的NewSequentialID创建功能时,您可能遇到设计问题,应该重新考虑您的计划。