У мене є просторовий індекс, для якого DBCC CHECKDB
повідомляється про корупцію:
DBCC CHECKDB(MyDB)
WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS
Просторовий індекс, індекс XML або індексований вигляд 'sys.extended_index_xxx_384000' (ідентифікатор об’єкта xxx) не містить усіх рядків, які створює визначення подання. Це не обов'язково означає проблему цілісності даних у цій базі даних.
Просторовий індекс, індекс XML або індексований вигляд 'sys.extended_index_xxx_384000' (ідентифікатор об'єкта xxx) містить рядки, які не були створені визначенням представлення. Це не обов'язково означає проблему цілісності даних у цій базі даних.
CHECKDB знайшов 0 помилок розподілу та 2 помилки узгодженості у таблиці 'sys.extended_index_xxx_384000' (ідентифікатор об'єкта xxx).
Рівень ремонту є repair_rebuild
.
Скасування та відтворення індексу не видаляє ці повідомлення про корупцію. Без, EXTENDED_LOGICAL_CHECKS
але з DATA_PURITY
помилкою не повідомляється.
Крім того, CHECKTABLE
для цієї таблиці потрібно 45 хвилин, хоча її CI має розмір 30 Мб, а рядки - близько 30 к. Усі дані в цій таблиці є точковими geography
даними.
Чи очікується така поведінка за будь-яких обставин? У ній написано: "Це не обов'язково означає проблему цілісності". Що я повинен робити? CHECKDB
не вдається, що є проблемою.
Цей сценарій відтворює проблему:
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
Це версія 12.0.4427.24 (SQL Server 2014 SP1 CU3).
Я написав таблицю зі схемою та даними, свіжий БД, виконую. Така ж помилка. CHECKDB також має цей неймовірний час виконання в 45 хвилин. Я захопив план запитів CHECKDB за допомогою SQL Profiler. Він має помилкове з'єднання циклу, очевидно, спричиняючи надмірне виконання. План має квадратичне виконання в кількості рядків таблиці! Приєднується подвійно вкладений контур сканування.
Очищення всіх непросторових індексів нічого не змінює.