Отключение индексов и ограничений

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

В этой статье описывается отключение индекса или ограничений в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Отключение индексов предотвращает доступ пользователя к индексам в случае использования кластеризованных индексов к данным базовой таблицы. Определение индекса остается в метаданных, и статистики индекса сохраняются на некластеризованных индексах. При отключении кластеризованного индекса в представлении или некластеризованного индекса данные индекса удаляются физически.

Отключение кластеризованного индекса в таблице запрещает доступ к данным. Данные по-прежнему остаются в таблице, но недоступны для операций языка обработки данных (DML), пока индекс не будет удален или перестроен.

Ограничения

Индекс не поддерживается, пока он отключен.

Оптимизатор запросов не учитывает отключенный индекс при создании планов выполнения запросов. Запросы, ссылающиеся на отключенные индексы с помощью табличного указания, также завершаются сбоем.

Невозможно создать индекс, использующий то же имя, что и существующий отключенный индекс.

Отключенный индекс может быть удален.

При отключении уникального индекса PRIMARY KEY также UNIQUE отключены ограничения и все FOREIGN KEY ограничения, ссылающиеся на индексированные столбцы из других таблиц. При отключении кластеризованного индекса все входящие и исходящие FOREIGN KEY ограничения базовой таблицы также отключены. При отключении индекса в предупреждающем сообщении приводятся имена ограничений. После перестроения индекса все ограничения должны быть включены вручную с помощью инструкции ALTER TABLE CHECK CONSTRAINT .

Некластеризованные индексы автоматически отключаются при отключении связанных с ними кластеризованных индексов. Они не могут быть включены до тех пор, пока кластеризованный индекс таблицы или представления не включен или кластеризованный индекс таблицы будет удален. Некластеризованные индексы должны быть явно включены, если кластеризованный индекс не был включен с помощью инструкции ALTER INDEX ALL REBUILD .

Оператор ALTER INDEX ALL REBUILD перестроит и включает все отключенные индексы в таблице, за исключением отключенных индексов в представлениях. Индексы представлений должны быть включены в отдельном ALTER INDEX ALL REBUILD операторе.

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

К строкам данных отключенного кластеризованного индекса нельзя получить доступ, кроме удаления или перестроения кластеризованного индекса.

Вы можете перестроить отключенный некластеризованный индекс в сети, если в таблице нет отключенного кластеризованного индекса. Однако при использовании оператора или CREATE INDEX WITH DROP_EXISTING оператора всегда необходимо перестроить отключенный кластеризованный индекс в автономном режимеALTER INDEX REBUILD. Дополнительные сведения об операциях с индексами в сети см. в разделе "Выполнение операций индекса в сети".

Инструкция CREATE STATISTICS не может быть успешно выполнена в таблице с отключенным кластеризованным индексом.

Параметр AUTO_CREATE_STATISTICS базы данных создает новую статистику по столбцу при отключении индекса и существуют следующие условия:

  • AUTO_CREATE_STATISTICS задан как ON.
  • Для данного столбца не существует статистик.
  • Статистики необходимы при оптимизации запросов.

Если кластеризованный индекс отключен, DBCC CHECKDB не может возвращать сведения о базовой таблице. Вместо этого инструкция сообщает, что кластеризованный индекс отключен. DBCC INDEXDEFRAG нельзя использовать для дефрагментации отключенного индекса; инструкция завершается ошибкой. Инструкция DBCC DBREINDEX может быть использована для перестроения отключенного индекса.

При создании нового кластеризованного индекса включаются ранее отключенные некластеризованные индексы. Дополнительные сведения см. в статье Enable Indexes and Constraints.

Если таблица является кучей, все некластеризованные индексы перестроены.

Разрешения

Для выполнения ALTER INDEX необходимо иметь как минимум разрешение ALTER для таблицы или представления.

Использование SQL Server Management Studio

Отключение индекса

  1. В обозреватель объектов выберите знак "плюс", чтобы развернуть базу данных, содержащую таблицу, в которой требуется отключить индекс.

  2. Чтобы развернуть папку Таблицы, выберите значок "плюс".

  3. Выберите знак "плюс", чтобы развернуть таблицу, в которой требуется отключить индекс.

  4. Выберите знак плюса, чтобы развернуть папку Indexes .

  5. Щелкните правой кнопкой мыши индекс, который необходимо отключить, и выберите пункт Отключить.

    Примечание.

    Если таблица открыта в режиме конструктора , элемент управления Disable недоступен. Чтобы продолжить, закройте конструктор таблиц и запустите его.

  6. В диалоговом окне "Отключить индексы" убедитесь, что правильный индекс находится в индексах, чтобы отключить сетку и нажмите кнопку "ОК".

Отключение всех индексов в таблице

  1. В обозреватель объектов выберите знак "плюс", чтобы развернуть базу данных, содержащую таблицу, в которой требуется отключить индексы.

  2. Чтобы развернуть папку Таблицы, выберите значок "плюс".

  3. Выберите знак плюса, чтобы развернуть таблицу, в которой необходимо отключить индексы.

  4. Щелкните правой кнопкой мыши папку Индексы и выберите Отключить все.

  5. В диалоговом окне "Отключить индексы" убедитесь, что правильные индексы находятся в индексах, чтобы отключить сетку и нажмите кнопку "ОК". Чтобы удалить индекс из индексов, чтобы отключить сетку, выберите индекс и нажмите клавишу DELETE .

В диалоговом окне Отключить индексы доступны следующие сведения:

  • Index Name

    Отображает имя индекса. В ходе выполнения в этом столбце также отображается значок, представляющий состояние.

  • Имя таблицы

    Отображает имя таблицы или представления, для которых был создан индекс.

  • Тип индекса

    Отображает тип индекса: кластеризованный, некластеризованный, пространственныйили XML.

  • Состояние

    Отображает состояние операции отключения. Возможные значения после выполнения.

    • Пробел

      Перед выполнением состояние пусто.

    • Выполняется

      Отключение индексов началось, но не завершено.

    • Успешно

      Операция отключения успешно завершена.

    • Ошибка

      Во время операции отключения индекса произошла ошибка, и операция не завершилась успешно.

    • Остановлено

      Отключение индекса не выполнено успешно, так как пользователь остановил операцию.

  • Сообщение

    Предоставляет текст сообщений об ошибках в ходе операции отключения. Во время выполнения ошибки отображаются в виде гиперссылок. Текст гиперссылок описывает тело ошибки. Столбец Сообщение редко имеет ширину, достаточную для прочтения всего текстового сообщения. Есть два способа получить полный текст.

    • Переместите указатель мыши на ячейку сообщения, чтобы отобразить подсказку с текстом ошибки.
    • Выберите гиперссылку, чтобы отобразить диалоговое окно, отображающее полную ошибку.

Использование Transact-SQL

В этой статье требуется AdventureWorks2022 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества Microsoft SQL Server.

Отключение индекса

  1. В обозревателе объектов подключитесь к экземпляру ядра СУБД.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить. Этот пример отключает IX_Employee_OrganizationLevel_OrganizationNode индекс в HumanResources.Employee таблице.

    USE AdventureWorks2022;
    GO
    
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode
        ON HumanResources.Employee
    DISABLE;
    

Отключение всех индексов в таблице

  1. В обозревателе объектов подключитесь к экземпляру ядра СУБД.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить. Этот пример отключает все индексы в HumanResources.Employee таблице.

    USE AdventureWorks2022;
    GO
    
    ALTER INDEX ALL ON HumanResources.Employee
    DISABLE;