非分区表索引在sys.partitions中出现重复行的问题排查
Azure SQL Database自动调优索引sys.partitions重复行异常问题
问题详情
- 涉及两张非分区表,其中一张表含116列、40个索引;两张表中由自动调优生成的索引均出现异常:在
sys.partitions中存在两行相同object_id、index_id、partition_number的记录 - 关联
sys.dm_db_partition_stats查询时,仅其中一行有数据,但另一行在sys.allocation_units中显示占用空间 - 常规索引重建操作无法消除重复行;删除该索引后重建,仍会保留重复行及原
index_id;手动创建同定义的索引则无此问题 - DBCC CHECKDB与DBCC CHECKTABLE结果均正常,且无法在其他环境复现该异常
sys.partitions示例数据
| partition_id | object_id | index_id | partition_number | hobt_id | rows | filestream_filegroup_id | data_compression | data_compression_desc | xml_compression | xml_compression_desc |
|---|---|---|---|---|---|---|---|---|---|---|
| 72057594082164736 | 1874105717 | 41 | 1 | 72057594082164736 | 48297 | 0 | 0 | NONE | 0 | OFF |
| 72057594124632064 | 1874105717 | 41 | 1 | 72057594124632064 | 905695 | 0 | 0 | NONE | 0 | OFF |
排查重复行的SQL语句
SELECT object_id, index_id, partition_number, count(*) as [# Rows] FROM sys.partitions GROUP BY object_id, index_id, partition_number HAVING COUNT(*) > 1
可能的原因分析
- 自动调优索引后台操作的元数据不一致:Azure SQL自动调优的索引创建/维护流程在后台异步执行,若过程中遇到突发中断(如资源争抢、进程异常终止),可能导致元数据表
sys.partitions与实际存储结构出现关联异常,常规重建操作无法修复这类元数据层面的残留问题 - 非分区表的分区元数据遗留异常:尽管表是非分区配置,但内部操作可能残留了重复的分区元数据条目,这类孤立条目不属于数据损坏范畴(因此CHECKDB无异常),常规索引操作不会触发清理逻辑
- 自动调优索引的系统标识复用问题:自动调优生成的索引带有系统内部标识,删除重建时系统可能未完全清理旧的元数据记录,导致新索引复用原
index_id时,旧的分区条目未被移除,从而出现重复记录
内容的提问来源于stack exchange,提问作者Nic
相关产品推荐
相关产品推荐

