TL; DR:我在索引视图中有无法修复的损坏。详细信息如下:
跑步
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
在我的一个数据库上产生以下错误:
消息8907,级别16,状态1,第1行空间索引,XML索引或索引视图“ ViewName”(对象ID 784109934)包含视图定义未生成的行。这不一定表示此数据库中数据的完整性问题。(...)
CHECKDB在表'ViewName'中发现0个分配错误和1个一致性错误。
repair_rebuild是最低修复级别(...)。
我确实知道,该消息表明索引视图“ ViewName”的物化数据与基础查询生成的数据不同。但是,手动验证数据不会出现任何差异:
SELECT * FROM ViewName WITH (NOEXPAND)
EXCEPT
SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...
SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...
EXCEPT
SELECT * FROM ViewName WITH (NOEXPAND)
NOEXPAND
用于强制在上使用(仅)索引ViewName
。FORCESCAN
用于防止发生索引视图匹配。执行计划确认两项措施均有效。
这里没有返回任何行,这意味着两个表是相同的。(只有整数和引导列,排序规则不起作用)。
无法通过在视图上重新创建索引或通过运行来修复错误DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS
。重复修复也无济于事。为什么DBCC CHECKDB
报告此错误?如何摆脱它?
(即使重建修复了问题,我的问题仍然存在-尽管我的数据检查查询成功运行,为什么还会报告错误?)
更新:该错误已在某些版本中修复。我无法再在SQL Server 2014 SP2 CU 5中重现它。2014 SP2 KB包含一个无KB的修补程序文章:Creating non-clustered index causes DBCC CheckDB With Extended_Logical_Checks to raise corruption error
。关于此的两个连接错误已关闭:
- https://connect.microsoft.com/SQLServer/feedback/details/847233/creating-non-clustered-index-causes-dbcc-checkdb-with-extended-logical-checks-to-raise-corruption-error
- https://connect.microsoft.com/SQLServer/feedback/details/795478/unfixable-dbcc-checkdb-error-that-is-also-a-false-positive-and-otherwise-strange
If the indexed view does not contain an aggregate over values of type float or real and you receive errors 8907 or 8708, drop the index on the view and re-create it. Do not use ALTER INDEX REBUILD to try to remove the differences between the stored and the computed view, because ALTER INDEX REBUILD does not recalculate the view before rebuilding the index. Then run DBCC CHECKTABLE on the View to verify no differences remain.
[1]
符号在注释标记降级中不起作用。