索引碎片处理-索引重建过程中处理时报异常错误[无法进行大容量加载、违反唯约束等]
幻影时空 2018-05-24 10:34:58 今有一问题困惑,到处 求助,希望大家可以帮忙分析且提供指导意见。谢谢。
情况描述:现有 单表行数约2.5亿条,数据文件占用 约 100G左右,索引文件占20G左右。
由于日常会有大量数据新增,且还会有定期数据物理删除,容易产生些 索引碎片,有一个日常定期的索引重建操作,
使用 ALTER INDEX ..... REBUILD 语句。
但近期 因前段时间 有遇到过 磁盘容量过满无日志空间等一些错误情况导致,数据库文件有些错误,现在 进行 聚集索引重建时,会报错:无法进行大容量加载。大容量数据流被错误地指定为已排序,或者数据违反了由目标表施加的唯一性约束。
——————
现使用方法的详情:
ALTER INDEX [PK_JW_Order] ON [dbo].[JW_Order] REBUILD PARTITION = ALL WITH ( ONLINE = ON, SORT_IN_TEMPDB = ON )
报错详情:
无法进行大容量加载。大容量数据流被错误地指定为已排序,或者数据违反了由目标表施加的唯一性约束。下面两行的排序顺序不正确: 第一行的主键: (xxxx001),第二行的主键: (xxx002)。
————————
对于这情况,网上 似乎 可查到的 资料 过少。 也有看到资料说,可用 DBCC CHECKDB 进行修复,但 之间因文件出时时,是使用过 DBCC CHECKDB 修复的, 由于整个库文件过大,且需要使用单用户模式,且尝试 修复过程太久,所以之前只尝试了一次之后, 这错误修复之后仍然还有的,
暂时还未使用 DBCC CHECKTABLE (或 DBCC DBREINDEX) 进行指定 表 和 索引重新尝试(这些修复方式,因需要 设置 为单用户处理的模式,暂时还未进行二次尝试哦)。
我的问题:
(1)
不确定 DBCC DBREINDEX 修复的原理 和 ALTER INDEX ..... REBUILD 是否有差异?
(2)
对于 “下面两行的排序顺序不正确 第一行的主键: (xxxx001),第二行的主键: (xxx002) “ 报错的信息,应该如何处理? 把这两主键数据删除,但也未起到使用哦?
(3)
如果还有其它方法,还有什么最有效的可以处理到呢?
(表重建和导数据可能性不大,表数据的实时性数据量很大,数据记录过大,导数据过程无法解决时效问题)