TL; DR: У індексованому вигляді у мене непоправна пошкодження. Ось деталі:
Біг
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
на одній з моїх баз даних виникає така помилка:
Msg 8907, рівень 16, стан 1, рядок 1 Просторовий індекс, індекс XML або індексований вигляд 'ViewName' (ідентифікатор об’єкта 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
використовувався для запобігання відповідності індексованого перегляду. План виконання підтверджує, що обидва заходи працюють.
Тут не повертаються рядки, це означає, що дві таблиці однакові. (Є лише цілі чи стовпчики з цілими та наведеннями, порівняння не вступають у дію).
Помилку неможливо виправити , відтворивши індекс у вікні перегляду чи запустивши DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS
. Повторення виправлень також не допомогло. Чому DBCC CHECKDB
повідомляється про цю помилку? Як позбутися від цього?
(Навіть якщо реконструкція виправлена, моє запитання все одно буде стояти - чому повідомляється про помилку, хоча мої запити перевірки даних успішно виконуються?)
Оновлення: помилка була виправлена в деяких випусках. Я більше не може відтворити його в SQL Server 2014 з пакетом оновлень 2 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-corrup-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]
Нотація не працює в зауваженні націнці вниз.