gpt4 book ai didi

sql-server - UniqueIdentifier 聚集索引上的 NewSequentialId

转载 作者:行者123 更新时间:2023-12-02 21:06:10 25 4
gpt4 key购买 nike

我正在为我公司即将启动的新数据库制定数据库标准。我们试图定义的事情之一是与唯一标识符相关的主键和聚集索引规则。

(注意:我不想讨论使用 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 在数据库中的具体表示方式,但我们假设这个 guid 以 3 开头,之前的 guid 以 7 开头,因此 3 个比 7 个“小”。)

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

所以我的问题是:由于下一组 UniqueIdentifiers 将小于上一组,因此每次插入都会导致我的聚集索引打乱吗?

如果没有,为什么? SQL Server 是否知道我正在使用 NewSequentialId?它如何弥补这一点?

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

或者它不知道,只是让一切井井有条。如果是这种情况,那么一次重新启动可能会严重影响性能。 (这让我觉得我需要自己的自定义 NewSequentialId,它不受重新启动的影响。)这是正确的吗?还是有什么我不知道的魔法?

编辑: GUID 作为聚集索引在我的标准中是强烈反对的。正如我上面所说,有很多原因表明这是一个坏主意。我正在尝试找出这是否是另一个原因。

最佳答案

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

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

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

要全面讨论该主题,没有比这更好的来源了

Kim
Tripp's
Blog

顺便说一句,当您考虑创建自己的 NewSequentialID 创建函数时,您可能会遇到设计问题,应该重新考虑您的计划。

关于sql-server - UniqueIdentifier 聚集索引上的 NewSequentialId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com