此问题与 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列?
差距不是千分之一,而是十分之一。 有没有学生遇到过类似的问题?
答案 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)