IDENTITY列中的差距 - 巨大的 - MS SQL Server 2008 R2标准64位SP3

时间:2015-08-28 07:02:44

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

此问题与 MS SQL 2008 Server Standard R2 SP3

中的奇怪行为有关

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

由于它不是正常负载而是质量插入 - 在此操作期间没有回滚,重启或任何其他问题。

因此,差距不是千分之一,而是十分之一。

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

差距不是千分之一,而是十分之一。 有没有学生遇到过类似的问题?

2 个答案:

答案 0 :(得分:1)

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

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

increment_value通常为1,但如果它是100,那么在插入10个新行之后,您的身份值将提前1000个。

答案 1 :(得分: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)