【问题标题】:Gap in IDENTITY column - gigantic - MS SQL Server 2008 R2 Standard 64 bit SP3IDENTITY 列中的差距 - 巨大 - MS SQL Server 2008 R2 标准 64 位 SP3
【发布时间】:2015-08-28 07:02:43
【问题描述】:

这个问题是关于MS SQL 2008 Server Standard R2 SP3

中的奇怪行为

我已经阅读了很多关于 SQL Server 中的 IDENTITY 增量以及它们之间的奇怪差距的问题。但基本上人们说它与交易或重启有关。 在我的情况下(我们使用 MS SQL Server 2008 R2 Standard 64 位 SP3 的命名实例)差距简直是巨大的。 应用程序在表中插入了 130 000 条记录,并且出现“算术溢出 IDENTITY 转换为 int”错误。 我们截断表,并批量插入 70 000 条记录。在批量插入 IDENTITY 列期间,最大值高于 9 000 000!

由于不是正常加载而是批量插入 - 在此操作期间没有回滚、重新启动或任何其他问题。

所以差距不是 1000 的大小,而是几十万。

由于我不控制应用程序代码(它是从其他公司购买的商业软件),我很害怕作为此类数据库的管理员我该怎么办?我必须每 6 个月截断一次表吗?实时监控ID栏?

差距不是 1000 的大小,而是几十万。 有遇到类似问题的同学吗?

【问题讨论】:

标签: sql-server sql-server-2008 tsql sql-server-2008-r2


【解决方案1】:

标识间隙的可能原因是插入语句回滚时。您正在使用第三方应用程序,这可能是这方面的罪魁祸首。因此,我建议您创建一个虚拟表来测试您的断言,如下所示,看看 sql server 是否导致间隙:

create table TestGaps
(
    id int identity(1,1)
    ,someValue char(5)
)
go
with cte as
(
    select 1  as rn,'ABCDE' as val
    union all
    select (rn + 1), val from cte where rn<32767 
)
insert into TestGaps(someValue)
select val from cte option(maxrecursion 32767)

【讨论】:

    【解决方案2】:

    抱歉,本身不是解决方案,但您可以从以下 sys 表中确认种子值和增量值;

    select
          object_name([object_id]) as [objectname]
        , [name]
        , [seed_value]
        , [increment_value]
        , *
    from sys.identity_columns
    

    increment_value 通常为 1,但如果它为 100,则在插入 10 个新行后,您的标识值将提高 1,000。

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多