Eu tenho um índice espacial para o qual DBCC CHECKDB
relata corrupções:
DBCC CHECKDB(MyDB)
WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS
O índice espacial, índice XML ou exibição indexada 'sys.extended_index_xxx_384000' (ID do objeto xxx) não contém todas as linhas que a definição da exibição produz. Isso não representa necessariamente um problema de integridade com os dados desse banco de dados.
O índice espacial, o índice XML ou a exibição indexada 'sys.extended_index_xxx_384000' (ID do objeto xxx) contém linhas que não foram produzidas pela definição da exibição. Isso não representa necessariamente um problema de integridade com os dados desse banco de dados.
O CHECKDB encontrou 0 erros de alocação e 2 erros de consistência na tabela 'sys.extended_index_xxx_384000' (ID do objeto xxx).
O nível de reparo é repair_rebuild
.
Descartar e recriar o índice não remove esses relatórios de corrupção. Sem EXTENDED_LOGICAL_CHECKS
mas com DATA_PURITY
o erro não é relatado.
Além disso, CHECKTABLE
leva 45 minutos para esta tabela, embora seu IC tenha 30 MB de tamanho e existam cerca de 30k linhas. Todos os dados nessa tabela são geography
dados pontuais .
Esse comportamento é esperado sob alguma circunstância? Ele diz "Isso não representa necessariamente um problema de integridade". O que eu deveria fazer? CHECKDB
está falhando, o que é um problema.
Este script reproduz o problema:
CREATE TABLE dbo.Cities(
ID int NOT NULL,
Position geography NULL,
CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED
(
ID ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
INSERT dbo.Cities (ID, Position) VALUES (20171, 0xE6100000010C4E2B85402E424A40A07312A518C72A40)
GO
CREATE SPATIAL INDEX IX_Cities_Position ON dbo.Cities
(
Position
)USING GEOGRAPHY_AUTO_GRID
WITH (
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Esta é a versão 12.0.4427.24 (SQL Server 2014 SP1 CU3).
Eu escrevi a tabela com esquema e dados, DB novo, execute. Mesmo erro. O CHECKDB também possui esse incrível tempo de execução de 45 minutos. Eu capturei o plano de consulta CHECKDB usando o SQL Profiler. Ele tem uma junção de loop equivocada, aparentemente causando tempo de execução excessivo. O plano possui tempo de execução quadrático no número de linhas da tabela! Junções de loop de verificação duplamente aninhadas.
A limpeza de todos os índices não espaciais não altera nada.