TL; DR: ฉันมีความเสียหายที่ไม่สามารถแก้ไขได้ในมุมมองที่จัดทำดัชนี นี่คือรายละเอียด:
วิ่ง
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
บนหนึ่งในฐานข้อมูลของฉันสร้างข้อผิดพลาดต่อไปนี้:
เกี่ยวกับข่าวสาร 8907 ระดับ 16 สถานะ 1 บรรทัด 1 ดัชนีเชิงพื้นที่ดัชนี XML หรือมุมมองที่จัดทำดัชนี 'ViewName' (ID วัตถุ 784109934) ประกอบด้วยแถวที่ไม่ได้สร้างขึ้นโดยการกำหนดมุมมอง สิ่งนี้ไม่จำเป็นต้องแสดงถึงปัญหาด้านความสมบูรณ์ของข้อมูลในฐานข้อมูลนี้ ( ... )
CHECKDB พบข้อผิดพลาดในการจัดสรร 0 ข้อและข้อผิดพลาดความสอดคล้อง 1 ข้อในตาราง 'ViewName'
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
ถูกใช้เพื่อป้องกันการจับคู่มุมมองที่มีการจัดทำดัชนีไว้ แผนการดำเนินการยืนยันว่าทั้งสองมาตรการใช้งานได้
ไม่มีการส่งคืนแถวที่นี่ซึ่งหมายความว่าทั้งสองตารางเหมือนกัน (มีคอลัมน์จำนวนเต็มและ guid เท่านั้นการเปรียบเทียบไม่เข้ามาเล่น)
ข้อผิดพลาดที่ไม่สามารถแก้ไขได้DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS
ด้วยการสร้างดัชนีในมุมมองหรือโดยการเรียกใช้ การทำซ้ำการแก้ไขก็ไม่ได้ช่วย เหตุใดจึงDBCC CHECKDB
รายงานข้อผิดพลาดนี้ จะกำจัดมันได้อย่างไร?
(แม้ว่าการสร้างขึ้นใหม่จะได้รับการแก้ไขคำถามของฉันจะยังคงอยู่ - ทำไมถึงเกิดข้อผิดพลาดถึงแม้ว่าการตรวจสอบข้อมูลของฉันจะทำงานได้สำเร็จ)
อัปเดต: ข้อผิดพลาดได้รับการแก้ไขในบางรุ่น ฉันไม่สามารถทำซ้ำใน SQL Server 2014 SP2 CU 5. 2014 SP2 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]
สัญกรณ์ไม่ได้ทำงานในความคิดเห็นเครื่องหมายลง