Почему отключение кластеризованного индекса делает таблицу недоступной?

11

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

Почему невозможно получить доступ к данным прямо из таблицы, отбрасывающей B-дерево? (скорее всего, сканируя таблицу строка за строкой) Разве это не было бы более уместно, чем сделать данные полностью недоступными?

Это чисто теоретический вопрос - я бы никогда этого не сделал. Это не сценарий и не то, что нужно делать, я просто хочу знать, почему все идет так, считайте это внутренним вопросом.

Тауфик Халифе
источник

Ответы:

10

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

Чтобы ответить на ваш вопрос, удобнее использовать основы индексации - индекс состоит из набора страниц (узлов индекса), которые организованы в виде структуры B-дерева. Эта структура имеет иерархическую природу, с корневым узлом вверху иерархии и листовыми узлами внизу. Для более подробной информации обратитесь сюда .

Кроме того, как многие люди описывали, Clustered Indexes == Исходные таблицы, которые физически упорядочены с одним или несколькими ключами или столбцами. Таким образом, когда кластерный индекс отключен, к его строкам данных нельзя получить доступ. Вы не сможете вставить какие-либо данные (для некластеризованного индекса вставка будет выполнена успешно - но это не совсем относится к этому сообщению - так как здесь речь идет о кластерном индексе), либо операция реорганизации не будет работать.

Ниже подробно объясню вам:

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

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

Теперь проверьте количество строк в таблице:

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

Теперь отключите кластерный индекс

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

Теперь выберите количество строк из таблицы. На этот раз произойдет ошибка с сообщением ниже:

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

Даже операция реорганизации не работает !!

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

Теперь перестройте Clustered Index, и он должен работать нормально.

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

Выберите таблицу, чтобы увидеть, можем ли мы получить доступ к данным

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

Итак, суть в том, что если мы отключим кластеризованный индекс, то данные в таблице все еще существуют, но не будут доступны ни для чего, кроме операций удаления или REBUILD. Все связанные некластеризованные индексы и представления будут недоступны, так как внешние ключи, ссылающиеся на таблицу, будут отключены, и там будет указана команда FAILURE для всех запросов, ссылающихся на таблицу.

Примечание. Нет возможности включить индекс. Вы должны перестроить его.

Кин Шах
источник
2

Уровень листьев дерева B + - это таблица. Чего вы надеетесь достичь, отключив CI? Только не делайте этого, если вы не хотите, чтобы данные были недоступны.

Я не совсем уверен, почему 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, то вы можете отключить кластерный индекс. Таблица существует вместе с данными, но полностью недоступна, пока вы не включите кластерный индекс. - Кеннет Фишер

user126897
источник