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
インデックス付きビューの一致を防ぐために使用されました。実行計画により、両方の対策が機能していることが確認されます。
ここには行が返されません。つまり、2つのテーブルは同一です。(整数列とGUID列のみがあり、照合は機能しません)。
ビューでインデックスを再作成するか、を実行してもエラーを修正できませんDBCC CHECKDB REPAIR_ALLOW_DATA_LOSS
。修正を繰り返しても解決しませんでした。なぜDBCC CHECKDB
このエラーを報告するのですか?それを取り除く方法は?
(再構築によって修正されたとしても、私の疑問は解決されません。データチェッククエリは正常に実行されますが、エラーが報告されるのはなぜですか?)
更新:バグはいくつかのリリースで修正されました。SQL Server 2014 SP2 CU 5では再現できなくなりました。2014SP2 KBには、KB記事なしの修正が含まれていますCreating non-clustered index causes DBCC CheckDB With Extended_Logical_Checks to raise corruption error
。これに関する2つの接続バグがクローズされました。
- 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]
表記はコメントマークダウンでは動作しません。