O dziwo, moja procedura składowana zaczęła odbierać Msg 666 dla niektórych danych wejściowych.
Procedura przechowywana kończy się niepowodzeniem w ostatnim kroku, gdy próbuje wstawić wiersz do tabeli o następującej strukturze:
Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint
Zasadniczo jest to tabela, która łączy wszystkie encje, do których istnieją odniesienia.
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)
Fragmentacja obu wskaźników jest niska (<25%). Jednak fragmentacja PK_TableName szybko rośnie, ponieważ ilość operacji na stole jest dość intensywna.
Rozmiar tabeli:
Row count: ~80,000,000 rows
Więc kiedy próbuję uruchomić bardzo proste zapytanie, dla niektórych D_Id pojawia się następujący komunikat:
Msg 666. Przekroczono maksymalną wygenerowaną przez system unikalną wartość dla zduplikowanej grupy dla indeksu o ID partycji 422223771074560. Usunięcie i ponowne utworzenie indeksu może rozwiązać ten problem; w przeciwnym razie użyj innego klucza klastrowania.
Przykład zapytania:
INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)
Na przykład, gdy ustawię D_Id na niektóre wartości - nie powiedzie się, na przykład „14”. Jeśli ustawię D_ID na inne wartości (1,2,3, ... 13, 15,16, ...), zapytanie będzie działać poprawnie.
Podejrzewam, że z indeksami dzieje się coś naprawdę złego ... Ale nie mogę dojść do sedna tego ... :( Dlaczego to się nie udaje?
źródło
TRUNCATE TABLE
resetuje unikalizator?INSERT INTO T VALUES (1),(1),(1),(2),(2);TRUNCATE TABLE T;INSERT INTO T VALUES (1),(1),(1),(2),(2)
najwyższy unikalizator2
zakłada, że wygląda na najwyższy unikalizator, który już istnieje dla tego klucza (w tym zapisów o duchach)