TL; DR: Dizinlenmiş görünümde düzeltilemez bir yolsuzluk var. İşte detaylar:
Koşu
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
veritabanlarımdan birinde aşağıdaki hata oluşuyor:
Msg 8907, Seviye 16, Durum 1, Satır 1 Uzamsal dizin, XML dizini veya dizinlenmiş görünüm 'ViewName' (nesne kimliği 784109934), görünüm tanımı tarafından üretilmeyen satırlar içeriyor. Bu, bu veritabanındaki verilerle bir bütünlük sorununu göstermez. (...)
CHECKDB 'ViewName' tablosunda 0 ayırma hatası ve 1 tutarlılık hatası buldu.
repair_rebuild minimum onarım düzeyidir (...).
Bu iletinin dizinlenmiş görünüm 'ViewName' malzeme verilerinin temel sorgunun ürettiği ile aynı olmadığını gösterdiğini anlıyorum. Ancak, verilerin manuel olarak doğrulanması herhangi bir tutarsızlığa neden olmaz:
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
(yalnızca) dizininin kullanılmasını zorlamak için kullanıldı ViewName
. FORCESCAN
dizine alınmış görünüm eşleşmesinin olmasını önlemek için kullanıldı. Uygulama planı her iki tedbirin de işe yaradığını teyit eder.
Burada hiçbir satır döndürülmez, yani iki tablo aynıdır. (Yalnızca tamsayı ve kılavuz sütunlar vardır, harmanlamalar devreye girmez).
Hata , dizini görünümde yeniden oluşturarak veya çalıştırarak düzeltilemezDBCC CHECKDB REPAIR_ALLOW_DATA_LOSS
. Düzeltmeleri tekrarlamak da yardımcı olmadı. Bu hatayı neden DBCC CHECKDB
bildiriyor? Nasıl kurtulur?
(Yeniden oluşturma sorunu düzeltilse bile sorum hala geçerli olacak - veri kontrol sorgularım başarıyla çalışmasına rağmen neden bir hata bildiriliyor?)
Güncelleme: Bazı sürümlerde hata giderildi. Artık 2014 SP2 CU 5. SQL Server üretebileceği 2014 SP2 KB KB makalesinde olmadan bir düzeltme içerir: Creating non-clustered index causes DBCC CheckDB With Extended_Logical_Checks to raise corruption error
. Bununla ilgili iki bağlantı hatası kapatıldı:
- 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]
Notasyonu comment işareti aşağı çalışmaz.