群集主键上的错误 666

Def*_*ite 6 sql-server insert azure-sql-database

我收到错误 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,但它不包括所有列,因此会进行书签查找。如果我在加载期间对目标表进行未提交的读取,我可以看到记录,并且标识不断增加。

我看到的最后一个执行计划是表扫描,然后是排序。

Def*_*ite 2

我通过一次批量插入 100m 条记录来解决这个问题。插入成功完成,没有错误,并且我能够插入 28.8 亿条记录。

我测试的另一个解决方案是将记录插入到具有标识列但没有聚集索引的表中,然后添加聚集主键。这也有效。

不知道为什么插入聚集表时会发生这种情况。我只在 Azure SQL MI 上进行了测试,而不是在我们的本地 SQL Server 2017 上进行了测试。所以我不知道是否有任何区别。