Правила выполнения фоновых операций с индексами
При выполнении фоновых операций с индексами придерживайтесь следующих правил.
Кластеризованные индексы должны создаваться, перестраиваться или удаляться в автономном режиме, если базовые таблицы содержат типы данных больших объектов: image, ntext, text, varchar(max), nvarchar(max), varbinary(max) и xml.
Неуникальные некластеризованные индексы могут создаваться в оперативном режиме, если таблица содержит типы данных больших объектов (LOB), но при этом, ни один из этих столбцов не участвует в определении индекса, ни в качестве ключевого, ни в качестве неключевого столбца. Некластеризованные индексы, определенные со столбцами типов данных больших объектов, должны создаваться и перестраиваться в автономном режиме.
Индексы локальных временных таблиц не могут создаваться, перестраиваться и удаляться в оперативном режиме. Это ограничение не относится к индексам глобальных временных таблиц.
Примечание |
---|
Фоновые операции с индексами доступны только в выпусках SQL Server Enterprise Edition, Developer Edition и Evaluation Edition. |
В следующей таблице перечислены операции с индексами, которые могут быть выполнены в оперативном режиме и индексы, которые исключаются из этих операций. Кроме того, в ней указаны дополнительные ограничения.
Фоновая операция с индексами |
Исключенные индексы |
Прочие ограничения |
---|---|---|
ALTER INDEX REBUILD |
Отключенный кластеризованный индекс или отключенное индексированное представление XML-индекс Индекс локальной временной таблицы |
Указание ключевого слова ALL может привести к ошибке выполнения операции, если таблица содержит исключенный индекс. На перестроение отключенных индексов налагаются дополнительные ограничения. Дополнительные сведения см. в разделе Правила отключения индексов. |
CREATE INDEX |
XML-индекс Начальный уникальный кластеризованный индекс представления Индекс локальной временной таблицы |
|
CREATE INDEX WITH DROP_EXISTING |
Отключенный кластеризованный индекс или отключенное индексированное представление Индекс локальной временной таблицы XML-индекс |
|
DROP INDEX |
Отключенный индекс XML-индекс Некластеризованный индекс Индекс локальной временной таблицы |
В одной инструкции не может быть указано несколько индексов. |
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY или ограничение UNIQUE) |
Индекс локальной временной таблицы Кластеризованный индекс |
Допускается только одно вложенное предложение за раз. Например: нельзя добавлять и удалять ограничения PRIMARY KEY и UNIQUE в одной и той же инструкции ALTER TABLE. |
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY или ограничение UNIQUE) |
Кластеризованный индекс |
Базовая таблица не может быть изменена, усечена или удалена, пока не завершилась фоновая операция с индексами.
Настройка параметра ONLINE (ON или OFF), указанная при создании или удалении кластеризованного индекса, относится ко всем перестраиваемым некластеризованным индексам. Например: если кластеризованный индекс построен в оперативном режиме с помощью инструкции CREATE INDEX WITH DROP_EXISTING, ONLINE=ON, все связанные с ним некластеризованные индексы также повторно создаются в оперативном режиме.
При оперативном создании или перестроении индекса UNIQUE построитель индексов и выполняющаяся одновременно пользовательская транзакция могут попытаться добавить одно и то же значение ключа, нарушая его уникальность. Если строка, введенная пользователем, вставляется в новый индекс прежде, чем исходная строка из таблицы-источника перемещается в новый индекс, фоновая операция с индексами завершится ошибкой.
С небольшой вероятностью фоновая операция с индексами может вызвать взаимоблокировку при работе с базой данных, вызванную работой пользователя или приложения. В этих редких случаях компонент SQL Server Database Engine определит жертвой взаимоблокировки активность пользователя или приложения.
Можно выполнять одновременные фоновые DLL-операции индекса одной таблицы или представления только при создании нескольких некластеризованных индексов либо при реорганизации некластеризованных индексов. Все остальные попытки выполнения фоновых операций с индексами завершаются ошибкой. Например: нельзя в оперативном режиме создавать новый индекс во время перестроения существующего индекса для этой же таблицы.
Рекомендации по месту на диске
В общем случае требования к свободному месту на диске при работе с индексами в оперативном и в автономном режиме одинаковы. Исключением является дополнительное место, необходимое для временного сопоставления индекса. Этот временный индекс применяется в фоновых операциях с индексами при создании, перестроении или удалении кластеризованных индексов. Удаление кластеризованного индекса в оперативном режиме требует столько же места, сколько и его создание в оперативном режиме. Дополнительные сведения см. в разделе Требования к месту на диске для DDL-операций индекса.
Вопросы производительности
Хотя фоновые операции с индексами допускают одновременную работу пользователей, в этом случае они выполняются тем дольше, чем интенсивнее происходит обновление данных. Обычно фоновые операции с индексами выполняются медленнее, чем аналогичные автономные операции, независимо от текущей интенсивности обновления данных.
Поскольку и исходная, и целевая структуры обслуживаются во время выполнения фоновой операции с индексами, увеличивается потребление ресурсов при вставке, обновлении и удалении, и это увеличение может доходить до двукратного. Это может привести к снижению производительности и повышению нагрузки на систему, особенно ресурсов ЦП. Фоновые операции с индексами полностью записываются в журнал.
Несмотря на то, что рекомендуется выполнять оперативные операции с индексами, необходимо предварительно оценить среду и определенные требования. Возможно, оптимальным решением может оказаться переключение в автономный режим. При этом на время выполнения операции пользователи будут иметь ограниченный доступ к данным, но она быстрее закончится и в итоге займет меньше ресурсов.
На многопроцессорных компьютерах под управлением выпуска SQL Server Enterprise инструкции индексирования могут потребовать дополнительных ЦП для выполнения операций просмотра и сортировки, как и любые другие запросы. Для управления количеством ЦП, выделенных для выполнения конкретных фоновых операций с индексами, можно воспользоваться параметром индексирования MAXDOP. В этом случае можно распределить потребляемые операцией с индексом ресурсы таким образом, чтобы не пострадали одновременно работающие пользователи. Дополнительные сведения см. в разделе Настройка параллельных операций с индексами.
Поскольку на финальной фазе удерживаются блокировки S-lock и Sch-M, будьте внимательны при выполнении фоновых операций с индексами внутри явно объявленных пользовательских транзакций (например: в блоке BEGIN TRANSACTION...COMMIT), поскольку в этом случае блокировка будет удерживаться до окончания транзакции, мешая одновременной работе пользователей.
Вопросы, касающиеся журнала транзакций
Масштабные операции с индексами, выполняемые в автономном или оперативном режиме, могут привести к формированию больших объемов данных, которые вызовут переполнение журнала транзакций. Для гарантии возможности отката операций с индексами журнал транзакций не может быть усечен до завершения операции с индексом, однако может быть выполнено его резервное копирование. Иными словами, журнал транзакций должен иметь достаточно места для сохранения и транзакции операции с индексом и текущих пользовательских транзакций на весь период выполнения операции с индексом. Дополнительные сведения см. в разделе Место на диске журнала транзакций для операций обработки индекса.
См. также