Seltsamerweise empfing meine gespeicherte Prozedur für einige Eingabedaten Nachricht 666.
Die gespeicherte Prozedur schlägt im letzten Schritt fehl, wenn versucht wird, eine Zeile in eine Tabelle mit der folgenden Struktur einzufügen:
Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint
Dies ist im Wesentlichen eine Tabelle, die alle referenzierten Entitäten miteinander verbindet.
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)
Die Fragmentierung für beide Indizes ist gering (<25%). Die Fragmentierung von PK_TableName nimmt jedoch schnell zu, da die Anzahl der Operationen in der Tabelle sehr hoch ist.
Tischgröße:
Row count: ~80,000,000 rows
Wenn ich also versuche, eine sehr einfache Abfrage auszuführen, erhalte ich für einige D_Ids die folgende Meldung:
Meldung 666. Der maximale vom System generierte eindeutige Wert für eine doppelte Gruppe wurde für den Index mit der Partitions-ID 422223771074560 überschritten. Durch Löschen und erneutes Erstellen des Index wird dies möglicherweise behoben. Verwenden Sie andernfalls einen anderen Clustering-Schlüssel.
Abfragebeispiel:
INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)
Wenn ich zum Beispiel D_Id auf einige Werte setze, schlägt dies fehl, zum Beispiel '14'. Wenn ich D_ID auf andere Werte setze (1,2,3, ... 13, 15,16, ...), läuft die Abfrage einwandfrei.
Ich vermute, dass mit Indizes etwas wirklich Schlimmes los ist ... Aber ich kann dem nicht auf den Grund gehen ... :( Warum scheitert es?
quelle
TRUNCATE TABLE
Können Sie zu Informationszwecken überprüfen, ob der Uniqueifier zurückgesetzt wird?INSERT INTO T VALUES (1),(1),(1),(2),(2);TRUNCATE TABLE T;INSERT INTO T VALUES (1),(1),(1),(2),(2)
dann der höchste Uniqueifier vermutlich2
der höchste Uniqueifier, der bereits für diesen Schlüssel existiert (einschließlich Ghost Records)