我收到错误 666:
超出了系统为重复组生成的最大唯一值。
我在 Azure SQL 托管实例上遇到过这种情况。
但是,我不应该收到此错误。有问题的索引是bigint identity
列上的聚集主键。所以没有重复项,也不应该是唯一化符。
该表开始为空,当前标识为零。我试图插入 29 亿条记录,让 SQL Server 分配标识键。收到错误666后,当前ident为2147483648。
这对我来说毫无意义,因为 uniquifier 应该只用于包含重复值的非唯一聚集索引。我的桌子不符合这些条件。
有人有什么想法吗?
使用INSERT INTO SELECT FROM ORDER BY
查询插入记录。除标识列本身外,所有列均已指定。我绝对确定标识列的数据类型是BIGINT
.
源表是一个没有标识或聚簇索引的堆表,因此bigint
那里不存在相关列。bigint identity
除了添加列/聚集主键外,目标表与源表具有重复定义。
我将所有记录从源表插入到目标表,在列列表/选择列表中指定源表中的所有列以进行插入。该bigint
列未在插入中指定,因为它只是目标端的标识列。
我有一个想法,首先用一个唯一的 id 列(如行号)预填充我的源堆表,identity_insert
在目标表上启用并尝试一次 100m 的批量插入。那行得通吗?
每次此查询失败都需要 15 个小时才能回滚。
在所需的插入顺序中,堆表上有一个 NCI,但它不包括所有列,因此会发生书签查找。如果我在加载期间对目标表进行未提交的读取,我可以看到标识不断增加的记录。
我看到的最后一个执行计划是表扫描,然后是排序。
我能够通过一次批量插入 100m 条记录来解决这个问题。插入成功完成,没有错误,我能够插入 28.8 亿条记录。
我测试的另一个解决方案是将记录插入到具有标识列但没有聚簇索引的表中,然后添加聚簇主键。这也奏效了。
不确定为什么会发生这种情况插入到聚簇表中。我只在 Azure SQL MI 上测试过这个,而不是我们的本地 SQL Server 2017。所以我不知道那里是否有任何区别。