小编Igo*_*lin的帖子

在 80M 行索引表上运行插入查询时出现 MSG 666

奇怪的是,我的存储过程开始收到一些输入数据的消息 666。

存储过程在最后一步尝试将行插入具有以下结构的表时失败:

Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint 
Run Code Online (Sandbox Code Playgroud)

这本质上是一个将所有引用实体连接在一起的表。

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)
Run Code Online (Sandbox Code Playgroud)

两个索引的碎片化程度都很低 (<25%)。然而 PK_TableName 碎片迅速增长,因为对表的操作量非常大。

桌子尺寸:

Row count: ~80,000,000 rows
Run Code Online (Sandbox Code Playgroud)

因此,当我尝试运行一个简单的查询时,对于某些 D_Id,我收到以下消息:

消息 666。对于分区 ID 为 422223771074560 的索引,已超出系统为重复组生成的最大唯一值。删除并重新创建索引可能会解决此问题;否则,使用另一个聚类键。

查询示例:

INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)
Run Code Online (Sandbox Code Playgroud)

例如,当我将 D_Id 设置为某些值时 - 它失败,例如“14”。如果我将 D_ID 设置为其他值 (1,2,3,...13, 15,16,...),则查询运行良好。

我怀疑索引有一些非常糟糕的事情......但我无法深入了解...... :(为什么它会失败?

index sql-server-2008 sql-server

10
推荐指数
1
解决办法
2094
查看次数

标签 统计

index ×1

sql-server ×1

sql-server-2008 ×1