Estranhamente, meu procedimento armazenado começou a receber a mensagem 666 para alguns dados de entrada.
O procedimento armazenado falha na última etapa quando tenta inserir uma linha em uma tabela com a seguinte estrutura:
Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint
Esta é essencialmente uma tabela que conecta todas as entidades referenciadas.
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)
A fragmentação para ambos os índices é baixa (<25%). No entanto, a fragmentação de PK_TableName aumenta rapidamente, pois a quantidade de operações na tabela é bastante intensa.
Tamanho da tabela:
Row count: ~80,000,000 rows
Portanto, quando tento executar uma consulta muito simples, para alguns dos D_Id, recebo a seguinte mensagem:
Msg 666. O valor exclusivo máximo gerado pelo sistema para um grupo duplicado foi excedido para o índice com o ID da partição 422223771074560. Descartar e recriar o índice podem resolver isso; caso contrário, use outra chave de cluster.
Exemplo de consulta:
INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)
Por exemplo, quando defino D_Id com alguns valores - ele falha, '14' por exemplo. Se eu definir D_ID para outros valores (1,2,3, ... 13, 15,16, ...), a consulta funcionará bem.
Eu suspeito que há algo realmente ruim acontecendo com os índices ... Mas não consigo chegar ao fundo disso ... :( Por que falha?
fonte
TRUNCATE TABLE
redefine o exclusivo?INSERT INTO T VALUES (1),(1),(1),(2),(2);TRUNCATE TABLE T;INSERT INTO T VALUES (1),(1),(1),(2),(2)
, em seguida, a maior uniqueifier é2
presumo que olha para o mais alto uniqueifier que já existe para essa chave (incluindo registros fantasmas)