群集主鍵上的錯誤 666
我收到錯誤 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 上進行了測試。所以我不知道那裡是否有任何區別。