gpt4 book ai didi

sql - SQL Server数据库中的身份增量正在跳跃

转载 作者:行者123 更新时间:2023-12-01 16:47:39 27 4
gpt4 key购买 nike

在 SQL Server 2012 数据库身份增量的“ReceiptNo”列中的一个表中,Fee 突然开始跳至 100,而不是 1,具体取决于以下两件事。

  1. 如果是1205446,则跳转到1206306,如果是1206321,则跳转到1207306,如果是1207314,则跳转到1208306。我想让您注意的是,最后三位数字仍然保留如下图所示,每次发生跳跃时都是常量,即 306。

  2. 重新启动计算机时出现此问题

enter image description here

最佳答案

由于 SQL Server 2012 以来的性能改进,您遇到此行为。

现在,在为 int 列分配 IDENTITY 值时,默认情况下使用 1,000 的缓存大小,并且重新启动服务可能会“丢失”未使用的值(缓存大小为bigint/numeric 为 10,000)。

the documentation中提到了这一点

SQL Server might cache identity values for performance reasons andsome of the assigned values can be lost during a database failure orserver restart. This can result in gaps in the identity value uponinsert. If gaps are not acceptable then the application should use itsown mechanism to generate key values. Using a sequence generator withthe NOCACHE option can limit the gaps to transactions that are nevercommitted.

从您显示的数据来看,这似乎发生在 12 月 22 日的数据输入之后,然后当它重新启动时,SQL Server 保留了值1206306 - 1207305。 12 月 24 日至 25 日的数据输入完成后,再次重新启动,SQL Server 保留了 28 日条目中可见的下一个范围 1207306 - 1208305

除非您以异常频率重新启动服务,否则任何“丢失”值都不太可能对数据类型允许的值范围产生任何重大影响,因此最好的策略是不要担心它。

如果由于某种原因这对您来说是一个真正的问题,那么一些可能的解决方法是......

  1. 您可以使用 SEQUENCE例如,代替标识列并定义较小的缓存大小,并在列默认值中使用 NEXT VALUE FOR
  2. 或者应用跟踪标志 272,这使得 IDENTITY 分配记录为 2008 R2 之前的版本。这适用于全局所有数据库。
  3. 或者,对于最新版本,执行 ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF 以禁用特定数据库的身份缓存。

您应该知道这些解决方法都不能确保没有间隙。 IDENTITY 从未保证过这一点,因为它只能通过序列化插入到表中来实现(如果没有这种序列化,则可以将标识值分配给最终失败的插入语句 - 例如,由于违反约束。或者简单地回滚事务)。如果您需要真正无间隙的色谱柱,则需要使用不同于 IDENTITYSEQUENCE ( example )

的解决方案

关于sql - SQL Server数据库中的身份增量正在跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14146148/

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