Руководящие принципы для операций с индексами
При выполнении операций с индексами в сети придерживайтесь следующих правил.
Кластеризованные индексы должны создаваться, перестраиваться или удаляться в режиме вне сети, если базовые таблицы содержат следующие типы данных больших объектов: image, ntext и text.
Индексы локальных временных таблиц не могут создаваться, перестраиваться и удаляться в режиме в сети. Это ограничение не относится к индексам глобальных временных таблиц.
Примечание |
---|
Операции с индексами в сети доступны не во всех выпусках Microsoft SQL Server. Список функций, поддерживаемых в разных выпусках SQL Server, см. в разделе Возможности, поддерживаемые различными выпусками SQL Server 2012. |
В следующей таблице перечислены операции с индексами, которые могут быть выполнены в режиме в сети и индексы, которые исключаются из этих операций. Кроме того, в ней указаны дополнительные ограничения.
Операция с индексами в сети |
Исключенные индексы |
Прочие ограничения |
---|---|---|
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. |
|
Базовая таблица не может быть изменена, усечена или удалена, пока не завершилась операция с индексами в сети.
Настройка параметра ONLINE (ON или OFF), указанная при создании или удалении кластеризованного индекса, относится ко всем перестраиваемым некластеризованным индексам. Например: если кластеризованный индекс построен в режиме в сети с помощью инструкции CREATE INDEX WITH DROP_EXISTING, ONLINE=ON, все связанные с ним некластеризованные индексы также повторно создаются в режиме в сети.
При создании или перестроении в сети индекса UNIQUE построитель индексов и выполняющаяся одновременно пользовательская транзакция могут попытаться добавить одно и то же значение ключа, нарушая его уникальность. Если строка, введенная пользователем, вставляется в новый индекс прежде, чем исходная строка из таблицы-источника перемещается в новый индекс, операция с индексами вне сети завершится ошибкой.
С небольшой вероятностью операция с индексами в сети может вызвать взаимоблокировку при работе с базой данных, вызванную работой пользователя или приложения. В этих редких случаях компонент Компонент ядра СУБД SQL Server определит жертвой взаимоблокировки активность пользователя или приложения.
Можно выполнять одновременные фоновые DLL-операции индекса одной таблицы или представления только при создании нескольких некластеризованных индексов либо при реорганизации некластеризованных индексов. Все остальные попытки выполнения операций с индексами в сети завершаются ошибкой. Например: нельзя в режиме в сети создавать новый индекс во время перестроения существующего индекса для этой же таблицы.
Операцию в сети нельзя выполнить, если индекс содержит столбец с типом больших объектов, и операции в сети в той же транзакции предшествует операция обновления. Для решения этой проблемы проводите операцию в сети либо вне такой транзакции, либо в транзакции, но перед операциями обновления.
Рекомендации по месту на диске
В общем случае требования к свободному месту на диске при работе с индексами и в режиме в сети и в режиме вне сети одинаковы. Исключением является дополнительное место, необходимое для временного сопоставления индекса. Этот временный индекс применяется в операциях с индексами в сети при создании, перестроении или удалении кластеризованных индексов. Удаление кластеризованного индекса в режиме в сети требует столько же места, сколько и его создание в режиме в сети. Дополнительные сведения см. в разделе Требования к месту на диске для DDL-операций индекса.
Вопросы производительности
Хотя операции с индексами в сети допускают одновременную работу пользователей, в этом случае они выполняются тем дольше, чем интенсивнее происходит обновление данных. Обычно операции с индексами в сети выполняются медленнее, чем аналогичные операции вне сети, независимо от текущей интенсивности обновления данных.
Поскольку и исходная, и целевая структуры обслуживаются во время выполнения операции с индексами в сети, увеличивается потребление ресурсов при вставке, обновлении и удалении, и это увеличение может доходить до двукратного. Это может привести к снижению производительности и повышению нагрузки на систему, особенно ресурсов ЦП. Операции с индексами в сети полностью записываются в журнал.
Несмотря на то, что рекомендуется выполнять операции с индексами в сети, необходимо предварительно оценить среду и определенные требования. Возможно, оптимальным решением может оказаться переключение в режим вне сети. При этом на время выполнения операции пользователи будут иметь ограниченный доступ к данным, но она быстрее закончится и в итоге займет меньше ресурсов.
На многопроцессорных компьютерах под управлением выпуска SQL Server 2012 инструкции индексирования могут потребовать дополнительных ЦП для выполнения операций просмотра и сортировки, как и любые другие запросы. Для управления количеством ЦП, выделенных для выполнения конкретных операций с индексами в сети, можно воспользоваться параметром индексирования MAXDOP. В этом случае можно распределить потребляемые операцией с индексом ресурсы таким образом, чтобы не пострадали одновременно работающие пользователи. Дополнительные сведения см. в разделе Настройка параллельных операций с индексами. Дополнительные сведения о выпусках SQL Server, поддерживающих параллельные операции с индексами, см. в разделе Функции, поддерживаемые различными выпусками SQL Server 2012 (https://go.microsoft.com/fwlink/?linkid=232473).
Поскольку на финальной фазе удерживаются блокировки S-lock и Sch-M, будьте внимательны при выполнении операций с индексами в сети внутри явно объявленных пользовательских транзакций (например: в блоке BEGIN TRANSACTION...COMMIT), поскольку в этом случае блокировка будет удерживаться до окончания транзакции, мешая одновременной работе пользователей.
При перестроении индекса в режиме «в сети» может возрасти фрагментация, когда операция выполняется с параметрами MAX DOP > 1 и ALLOW_PAGE_LOCKS = OFF. Дополнительные сведения см. в разделе Как это работает. Перестроение индекса в сети может вызвать увеличение фрагментации.
Вопросы, касающиеся журнала транзакций
Масштабные операции с индексами, выполняемые в режиме в сети или вне сети, могут привести к формированию больших объемов данных, которые вызовут переполнение журнала транзакций. Для гарантии возможности отката операций с индексами журнал транзакций не может быть усечен до завершения операции с индексом, однако может быть выполнено его резервное копирование. Иными словами, журнал транзакций должен иметь достаточно места для сохранения и транзакции операции с индексом и текущих пользовательских транзакций на весь период выполнения операции с индексом. Дополнительные сведения см. в разделе Место на диске журнала транзакций для операций обработки индекса.
См. также
Об операциях с индексом в сети