TL; DR: Ich habe eine unfixierbare Beschädigung in einer indizierten Ansicht. Hier sind die Details:
Laufen
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
In einer meiner Datenbanken tritt der folgende Fehler auf:
Meldung 8907, Ebene 16, Status 1, Zeile 1 Der räumliche Index, der XML-Index oder die indizierte Sicht 'ViewName' (Objekt-ID 784109934) enthält Zeilen, die nicht von der Sichtdefinition erstellt wurden. Dies ist nicht unbedingt ein Integritätsproblem mit den Daten in dieser Datenbank. (...)
CHECKDB hat in der Tabelle 'ViewName' 0 Zuordnungsfehler und 1 Konsistenzfehler gefunden.
repair_rebuild ist die Mindestreparaturstufe (...).
Ich verstehe, dass diese Nachricht darauf hinweist, dass die materialisierten Daten der indizierten Ansicht 'ViewName' nicht mit den Ergebnissen der zugrunde liegenden Abfrage identisch sind. Die manuelle Überprüfung der Daten führt jedoch nicht zu Unstimmigkeiten:
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
wurde verwendet, um die Verwendung des (einzigen) Index zu erzwingen ViewName
. FORCESCAN
wurde verwendet, um den Abgleich der indizierten Ansicht zu verhindern. Der Ausführungsplan bestätigt, dass beide Maßnahmen wirksam sind.
Hier werden keine Zeilen zurückgegeben, was bedeutet, dass die beiden Tabellen identisch sind. (Es gibt nur Ganzzahl- und Guid-Spalten, Kollatierungen kommen nicht ins Spiel).
Der Fehler kann nicht behoben werden, indem der Index für die Ansicht neu erstellt oder ausgeführt wird DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS
. Das Wiederholen der Fixes hat auch nicht geholfen. Warum wird DBCC CHECKDB
dieser Fehler gemeldet? Wie kann man es loswerden?
(Selbst wenn das Problem durch Neuerstellung behoben wird, bleibt meine Frage bestehen. Warum wird ein Fehler gemeldet, obwohl meine Abfragen zur Datenüberprüfung erfolgreich ausgeführt wurden?)
Update: Der Fehler wurde in einigen Releases behoben. Ich kann nicht reproduzieren länger in SQL Server 2014 SP2 CU 5. 2014 SP2 KB ein Update ohne KB - Artikel enthält: Creating non-clustered index causes DBCC CheckDB With Extended_Logical_Checks to raise corruption error
. Die beiden Verbindungsfehler wurden geschlossen:
- 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]
Notation funktioniert nicht im Kommentar-Mark-Down.