Curiosamente, mi procedimiento almacenado comenzó a recibir Msg 666 para algunos datos de entrada.
El procedimiento almacenado falla en el último paso cuando intenta insertar una fila en una tabla con la siguiente estructura:
Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint
Esta es esencialmente una tabla que conecta todas las entidades referenciadas juntas.
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)
La fragmentación para ambos índices es baja (<25%). Sin embargo, la fragmentación PK_TableName crece rápidamente, ya que la cantidad de operación en la tabla es bastante intensa.
Tamaño de la mesa:
Row count: ~80,000,000 rows
Entonces, cuando intento ejecutar una consulta muy simple, para algunos de los D_Id aparece el siguiente mensaje:
Mensaje 666. Se excedió el valor único generado por el sistema máximo para un grupo duplicado para el índice con el ID de partición 422223771074560. Soltar y volver a crear el índice puede resolver esto; de lo contrario, use otra clave de agrupación.
Ejemplo de consulta:
INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)
Por ejemplo, cuando configuro D_Id en algunos valores, falla, por ejemplo, '14'. Si configuro D_ID a otros valores (1,2,3, ... 13, 15,16, ...), la consulta funciona bien.
Sospecho que hay algo realmente malo con los índices ... Pero no puedo llegar al fondo de esto ... :( ¿Por qué falla?
fuente
TRUNCATE TABLE
restablece el unificador?INSERT INTO T VALUES (1),(1),(1),(2),(2);TRUNCATE TABLE T;INSERT INTO T VALUES (1),(1),(1),(2),(2)
, el unificador más alto es2
Supongo que mira el unificador más alto que ya existe para esa clave (incluidos los registros de fantasmas)