TL; DR: Tôi đã có một tham nhũng không thể sửa chữa trong một cái nhìn được lập chỉ mục. Đây là những thông tin chi tiết:
Đang chạy
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
trên một trong những cơ sở dữ liệu của tôi tạo ra lỗi sau:
Msg 8907, Cấp 16, Trạng thái 1, Dòng 1 Chỉ mục không gian, chỉ mục XML hoặc chế độ xem được lập chỉ mục 'ViewName' (ID đối tượng 784109934) chứa các hàng không được tạo bởi định nghĩa chế độ xem. Điều này không nhất thiết thể hiện vấn đề toàn vẹn với dữ liệu trong cơ sở dữ liệu này. (...)
CHECKDB đã tìm thấy 0 lỗi phân bổ và 1 lỗi nhất quán trong bảng 'ViewName'.
Repair_Vbuild là mức sửa chữa tối thiểu (...).
Tôi hiểu rằng thông báo này chỉ ra rằng dữ liệu được cụ thể hóa của chế độ xem được lập chỉ mục 'ViewName' không giống với những gì truy vấn cơ bản tạo ra. Tuy nhiên, việc xác minh dữ liệu theo cách thủ công không tạo ra bất kỳ sự khác biệt nào:
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
đã được sử dụng để buộc sử dụng chỉ số (chỉ) trên ViewName
. FORCESCAN
đã được sử dụng để ngăn chặn việc xem chỉ mục phù hợp xảy ra. Kế hoạch thực hiện xác nhận cả hai biện pháp để làm việc.
Không có hàng nào được trả về ở đây, có nghĩa là hai bảng giống hệt nhau. (Chỉ có các cột số nguyên và hướng dẫn, các bộ sưu tập không đi vào hoạt động).
Các lỗi không thể được cố định bằng cách tái tạo chỉ mục trên quan điểm hoặc bằng cách chạy DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS
. Lặp đi lặp lại các bản sửa lỗi cũng không giúp được gì. Tại sao DBCC CHECKDB
báo cáo lỗi này? Làm thế nào để thoát khỏi nó?
(Ngay cả khi xây dựng lại cố định, câu hỏi của tôi vẫn đứng vững - tại sao một lỗi được báo cáo mặc dù các truy vấn kiểm tra dữ liệu của tôi chạy thành công?)
Cập nhật: Lỗi đã được sửa trong một số bản phát hành. Tôi không còn có thể sao chép nó trong SQL Server 2014 SP2 CU 5. 2014 SP2 KB chứa bản sửa lỗi mà không có bài viết KB : Creating non-clustered index causes DBCC CheckDB With Extended_Logical_Checks to raise corruption error
. Hai lỗi kết nối về điều này đã bị đóng:
- https://connect.microsoft.com/QueryServer/feedback/details/847233/creating-non-clustered-index-causes-dbcc-checkdb-with-extends-logical-checks-to-raise-corruption-error
- https://connect.microsoft.com/QueryServer/feedback/details/795478/unfixable-dbcc-checkdb-error-that-is-also-a-false-poseitive-and-therwise-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]
ký hiệu không hoạt động trong comment dấu xuống.