【问题标题】:NewSequentialId on UniqueIdentifier Clustered IndexUniqueIdentifier 聚集索引上的 NewSequentialId
【发布时间】:2011-10-20 03:09:50
【问题描述】:

我正在为我的公司正在启动的新数据库制定数据库标准。我们试图定义的一件事是与 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 范围正好处于其他先前范围中间的风险。

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

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

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

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

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

【问题讨论】:

  • “如果是这种情况,那么一次重启可能会严重影响性能。” - 这就是为什么你想使用 int IDENTITY(),即使你不想听到它。

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


【解决方案1】:

通常,您将使用适当的FILL FACTOR 创建索引,以便在所有页面中为这种情况留出空白空间。话虽如此,一旦空白空间被填满,聚集索引确实会重新排序。

我知道您不想讨论将 GUID 用作集群键,但这是不建议这样做的原因之一。

将会发生的情况是,您将有越来越多的页面拆分,这将导致在您不断插入行时产生非常高的碎片,并且您需要以更高的频率重建索引以保持性能行。

要全面了解该主题,没有比此更好的来源

Kim
Tripp's
Blog

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

【讨论】:

  • 我已经阅读了她的几篇文章。在我的标准中,强烈建议不要将 GUID 作为聚集索引。我正在尝试建立一个案例来说明原因。 (因此这个问题。)
  • 一旦达到填充因子,每次插入都会导致重新排序吗?
  • 视情况而定。填充因子是按页面计算的,所以一旦页面已满,就可以了。如果需要插入的页面已满,所有后续插入都将导致重新排序。
猜你喜欢
  • 2012-08-26
  • 2019-02-13
  • 1970-01-01
  • 2020-10-08
  • 2014-01-16
  • 2013-08-07
  • 2023-03-23
  • 2011-07-02
相关资源
最近更新 更多