Чому відключення кластерного індексу робить таблицю недоступною?


11

Коли індекс відключений, визначення залишається в системному каталозі, але більше не використовується. SQL Server не підтримує індекс (оскільки дані в таблиці змінюються), і індекс не може бути використаний для задоволення запитів. Якщо кластерний індекс вимкнено, вся таблиця стає недоступною.

Чому не можна отримати доступ до даних безпосередньо з таблиці, що відкидає B-дерево? (найімовірніше, скануючи таблицю за рядком) Хіба це не буде більш підходящим, ніж зробити цілком недоступними дані?

Це суто теоретичне питання - я ніколи б цього не робив. Це не сценарій і не обов'язкова річ, я просто хочу знати, чому річ іде таким шляхом, вважаю це питанням внутрішніх справ.

Відповіді:


10

чому неможливо отримати доступ до даних безпосередньо з таблиці, що відкидає B-дерево? (швидше за все, скануючи таблицю за рядком), чи не буде це взагалі більше, ніж недоступні дані?

Щоб відповісти на ваше запитання, основи індексації стають більш зручними - індекс складається з набору сторінок (вузлів індексу), які організовані в структурі дерева B. Ця структура має ієрархічний характер, з кореневим вузлом вгорі ієрархії та листковими вузлами внизу. Детальніше дивіться тут .

Крім того, як описано багатьма людьми, Clustered Indexes == Оригінальні таблиці, які фізично впорядковані одним або декількома клавішами або стовпцями. Отже, коли кластерний індекс відключений, до його рядків даних не можна отримати доступ. Ви не зможете вставити будь-які дані (для Індексу, який не кластеризується, Вставка буде успішною, але це не повністю пов’язано з цією публікацією, - як тут йдеться про індекс кластера), або жодна операція реорганізації не працюватиме.

Нижче докладно пояснимо:

ми будемо використовувати базу даних Adventureworks, щоб побачити ефект відключення індексу CLUSTERED .

введіть тут опис зображення

Тепер перевірте кількість рядків у таблиці:

введіть тут опис зображення

Тепер вимкніть індекс кластера

введіть тут опис зображення

Тепер виберіть кількість таблиць із таблиці. Цього разу вона вийде з помилкою нижче:

введіть тут опис зображення

Навіть операція по реорганізації не працює !!

введіть тут опис зображення

Тепер відновіть індекс кластера, і він повинен працювати добре.

введіть тут опис зображення

Виберіть таблицю, щоб побачити, чи можемо ми отримати доступ до даних

введіть тут опис зображення

Отже, підсумок полягає в тому, що якщо ми відключимо індекс кластеру, то Дані в таблиці все ще існують, але вони не будуть доступні ні для чого, крім операцій Drop або REBUILD. Усі пов’язані некластеризовані індекси та представлення будуть недоступними, а зовнішні ключі, на які посилається таблиця, будуть відключені, і там буде проведено помилку для всіх запитів, на які посилається таблиця.

Примітка. Немає можливості ЗАКРИТИ індекс. Ви повинні її ВИПУСКАТИ.


2

Рівень листя дерева B + є таблицею. Чого ви сподіваєтеся досягти, відключивши ІС? Просто не робіть цього, якщо ви не хочете, щоб дані були недоступними.

Я не дуже впевнений, чому SQL Server навіть дозволяє це зробити.

CREATE TABLE T
(
    X INT CONSTRAINT PK PRIMARY KEY CLUSTERED, 
    Y INT CONSTRAINT UQ UNIQUE NONCLUSTERED
);

ALTER INDEX PK ON T DISABLE;

... також відключає NCI, тому навіть SELECTзапити, які будуть охоплені цим, відключаються. Я не можу придумати жодного випадку використання для цього. - мартін-коваль

Єдине використання, про яке я можу придумати голову, - це саме те, про що йде мова. Вимкнення таблиці. Якщо у вас є таблиця , в якій ви не хочете нікого дотику, навіть dboчи sysadmin, то ви можете відключити кластерний індекс. Таблиця існує разом із даними, але є абсолютно недоступною, поки ви знову не ввімкнете кластерний індекс. - кеннет-рибалка

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.