Thật kỳ lạ, quy trình được lưu trữ của tôi bắt đầu nhận Msg 666 cho một số dữ liệu đầu vào.
Thủ tục lưu trữ không thành công ở bước cuối cùng khi nó cố gắng chèn một hàng vào bảng có cấu trúc sau:
Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint
Đây thực chất là một bảng kết nối tất cả các thực thể được tham chiếu với nhau.
Indexes:
IX_TableName_D_id - Clustered index on D_id column
PK_TableName - Unique non-clustered index on all columns (A_Id, B_Id, C_Id, D_Id)
Phân mảnh cho cả hai chỉ số thấp (<25%). Tuy nhiên, phân mảnh PK_TableName nhanh chóng phát triển, vì số lượng hoạt động trên bàn khá dữ dội.
Kích thước bảng:
Row count: ~80,000,000 rows
Vì vậy, khi tôi cố gắng chạy một truy vấn đơn giản,, đối với một số D_Id, tôi nhận được thông báo sau:
Msg 666. Giá trị duy nhất do hệ thống tạo tối đa cho một nhóm trùng lặp đã bị vượt quá đối với chỉ mục với ID phân vùng 422223771074560. Việc thả và tạo lại chỉ mục có thể giải quyết điều này; mặt khác, sử dụng một khóa phân cụm khác.
Ví dụ truy vấn:
INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)
Ví dụ: khi tôi đặt D_Id thành một số giá trị - chẳng hạn, '14'. Nếu tôi đặt D_ID thành các giá trị khác (1,2,3, ... 13, 15,16, ...), truy vấn sẽ chạy tốt.
Tôi nghi ngờ có điều gì đó thực sự tồi tệ xảy ra với các chỉ mục ... Nhưng tôi không thể đi đến tận cùng của điều này ... :( Tại sao nó thất bại?
TRUNCATE TABLE
đặt lại bộ duy nhất không?