Як не дивно, моя збережена процедура почала отримувати Msg 666 для деяких вхідних даних.
Збережена процедура провалюється на останньому кроці, коли вона намагається вставити рядок у таблицю з такою структурою:
Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint
Це по суті таблиця, яка з'єднує всі посилаються об'єкти разом.
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)
Фрагментація обох показників низька (<25%). Однак фрагментація PK_TableName швидко зростає, оскільки кількість операцій на столі досить інтенсивна.
Розмір таблиці:
Row count: ~80,000,000 rows
Отже, коли я намагаюся запустити простий запит veeery, для деяких D_Id я отримую таке повідомлення:
Msg 666. Максимальне унікальне значення, що генерується системою для подвійної групи, було перевищено для індексу з ідентифікатором розділу 422223771074560. Скасування та повторне створення індексу може вирішити це; в іншому випадку використовуйте інший кластерний ключ.
Приклад запиту:
INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)
Наприклад, коли я встановлюю D_Id деяким значенням - він не працює, наприклад, "14". Якщо я встановив D_ID іншим значенням (1,2,3, ... 13, 15,16, ...), запит працює нормально.
Я підозрюю, що з індексами відбувається щось по-справжньому погано ... Але я не можу дійти до цього… :( Чому це не вдається?
TRUNCATE TABLE
скидає унікальний код?