UniqueIquenntifId上的NewSequentialId

Vac*_*ano 6 sql-server uniqueidentifier clustered-index sql-server-2008 newsequentialid

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

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

所以这是我担心的场景:

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

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

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

然后我重启我的服务器.NewSequentialId文档说"重新启动Windows后,GUID可以从较低的范围重新开始,但仍然是全局唯一的."

因此下一个起点可能低于前一个范围.

所以重启后,我再插入3个值:

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

(我不确定guid在数据库中是如何表示的,但我们假设因为这个从3开始,之前的7以7开始,3个比7个小".".

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

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

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

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

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

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

JNK*_*JNK 2

通常,您将在创建索引时适当地FILL FACTOR在所有页面中留出空白空间,以应对这种情况。话虽如此,一旦空白空间被填充,聚集索引就会重新排序。

我知道您不想讨论用作GUID聚集键,但这是不推荐实践的原因之一。

将会发生的情况是,页面拆分量将不断增加,当您不断插入行时,这将导致非常高的碎片水平,并且您将需要以更高的频率重建索引以保持性能一致。

对于这个主题的完整处理,没有比这更好的来源了

金·
特里普的
博客

附带说明一下,当您考虑创建自己的 NewSequentialID 创建函数时,您可能遇到设计问题,应该重新考虑您的计划。