Рекомендации по операциям с индексами в режиме "в сети"
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
При выполнении операций с индексами в сети придерживайтесь следующих правил.
- Кластеризованные индексы должны создаваться, перестраиваться или удаляться в режиме вне сети, если базовая таблица содержит следующие типы данных больших объектов: image, ntextи text.
- Неуникальные некластеризованные индексы могут создаваться в режиме в сети, если таблица содержит типы данных больших объектов (LOB), но при этом, ни один из этих столбцов не участвует в определении индекса, ни в качестве ключевого, ни в качестве неключевого столбца.
- Индексы локальных временных таблиц не могут создаваться, перестраиваться и удаляться в интерактивном режиме. Это ограничение не относится к индексам глобальных временных таблиц.
- Индексы можно возобновить, когда он остановился после неожиданного сбоя, отработки отказа базы данных или
PAUSE
команды. Ознакомьтесь со сведениями об инструкциях Create Index и Alter Index.
Примечание.
Операции с индексами в Сети недоступны в каждом выпуске Microsoft SQL Server. Список функций, поддерживаемых выпусками SQL Server, см. в выпусках и поддерживаемых функциях SQL Server 2022.
В следующей таблице перечислены операции с индексами, которые могут быть выполнены в сети, а также индексы, которые исключаются из этих операций, и ограничения для возобновляемого индекса. Кроме того, в ней указаны дополнительные ограничения.
Операция с индексами в сети | Исключенные индексы | Прочие ограничения |
---|---|---|
ALTER INDEX REBUILD |
Отключенный кластеризованный индекс или отключенное индексированное представление XML-индекс Индекс columnstore Индекс локальной временной таблицы |
Указание ключевого слова 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 ) |
Кластеризованный индекс |
Базовая таблица не может быть изменена, усечена или удалена во время выполнения операции индекса в сети.
Параметр параметра в сети (ON
или OFF
) указан при создании или удалении кластеризованного индекса применяется к любым некластеризованным индексам, которые должны быть перестроены. Например, если кластеризованный индекс построен в Сети с помощью CREATE INDEX WITH DROP_EXISTING, ONLINE=ON
, все связанные некластеризованные индексы также повторно создаются в Сети.
При создании или перестроении UNIQUE
индекса в сети построитель индексов и параллельная транзакция пользователя могут попытаться вставить один и тот же ключ, поэтому нарушая уникальность. Если строка, введенная пользователем, вставляется в новый индекс (целевой) до перемещения исходной строки из исходной таблицы в новый индекс, операция онлайн-индекса завершается ошибкой.
С небольшой вероятностью операция с индексами в сети может вызвать взаимоблокировку при работе с базой данных, вызванную работой пользователя или приложения. В этих редких случаях SQL Server ядро СУБД выбирает действие пользователя или приложения в качестве жертвы взаимоблокировки.
Вы можете выполнять параллельные операции DDL индекса в одной таблице или представлении только при создании нескольких некластеризованных индексов или реорганизации некластеризованных индексов. Все остальные попытки выполнения операций с индексами в сети завершаются ошибкой. Например, невозможно создать новый индекс в сети при перестроении существующего индекса в той же таблице.
Не удается выполнить операцию в сети, если индекс содержит столбец большого типа объекта, а в той же транзакции выполняются операции обновления перед этой оперативной операцией. Для решения этой проблемы проводите операцию в сети либо вне такой транзакции, либо в транзакции, но перед операциями обновления.
Рекомендации по месту на диске
Операции с индексами в режиме "в сети" требуют больше дискового пространства, чем автономные операции с индексами.
- Для операций создания и перестроения индексов требуется дополнительное пространство.
- Кроме того, дисковое пространство используется для временного индекса сопоставления. Этот временный индекс применяется в операциях с индексами в сети при создании, перестроении или удалении кластеризованных индексов.
- Удаление кластеризованного индекса в режиме "в сети" требует столько же места, сколько и его создание (или перестроение) в режиме "в сети".
Дополнительные сведения см. в статье Disk Space Requirements for Index DDL Operations.
Замечания, связанные с быстродействием
Хотя операции с индексами в сети позволяют одновременно выполнять действия обновления пользователей, операции индекса могут занять больше времени, если действие обновления очень тяжело. Как правило, операции с индексами в сети медленнее, чем эквивалентные автономные операции индексов независимо от уровня параллельного обновления.
Поскольку и исходная, и целевая структуры обслуживаются во время выполнения операции с индексами в сети, увеличивается потребление ресурсов при вставке, обновлении и удалении, и это увеличение может доходить до двукратного. Это может привести к снижению производительности и повышению нагрузки на систему, особенно ресурсов ЦП. Операции с индексами в сети полностью записываются в журнал.
Несмотря на то, что рекомендуется выполнять операции с индексами в сети, необходимо предварительно оценить среду и определенные требования. Это может быть оптимально для запуска операций индексов в автономном режиме. При этом доступ пользователей к данным ограничен во время операции, но операция завершается быстрее и использует меньше ресурсов.
На компьютерах с несколькими обработчиками, работающих под управлением SQL Server 2016 (13.x), инструкции индекса могут использовать больше процессоров для выполнения операций сканирования и сортировки, связанных с инструкцией индекса так же, как и другие запросы. Вы можете использовать MAXDOP
параметр индекса для управления количеством процессоров, выделенных для операции индекса в сети. Таким образом, можно сбалансировать ресурсы, используемые операцией индекса с ресурсами одновременных пользователей. Дополнительные сведения см. в статье Настройка параллельных операций с индексами. Дополнительные сведения о выпусках SQL Server, поддерживающих параллельные операции индексов, см . в выпусках и поддерживаемых функциях SQL Server 2022.
Так как блокировка S-lock или Sch-M хранится на заключительном этапе операции индекса, будьте осторожны при выполнении операции онлайн-индекса внутри явной транзакции пользователя, например BEGIN TRANSACTION ... COMMIT
блока. поскольку в этом случае блокировка будет удерживаться до окончания транзакции, мешая одновременной работе пользователей.
Перестроение индексов в Сети может увеличить фрагментацию при выполнении с MAXDOP
большей, чем 1
, и ALLOW_PAGE_LOCKS=OFF
. Дополнительные сведения см. в статье Как это работает. Перестроение индекса в сети может привести к увеличению фрагментации.
Рекомендации по журналу транзакций
Крупномасштабные операции индексов, выполняемые в автономном режиме или в сети, могут создавать большие нагрузки данных, что приводит к быстрому заполнению журнала транзакций. Это связано с тем, что операции перестроения индексов в автономном режиме и в сети полностью регистрируются. Чтобы убедиться, что операция индекса может быть откатена, журнал транзакций не может быть усечен до завершения операции индекса; однако журнал можно создать резервную копию во время операции индекса.
Таким образом, журнал транзакций должен иметь достаточно места для хранения как транзакций операций индекса, так и любых параллельных транзакций пользователей во время операции индекса. Дополнительные сведения см. в статье Transaction Log Disk Space for Index Operations.
Рекомендации по возобновляемому индексу
Параметр повторного индекса для создания индекса и перестроения индексов применяется к SQL Server (перестроение индекса начиная с SQL Server 2017 (14.x) и создание индекса, поддерживаемого в SQL Server 2019 (15.x)) и База данных SQL Azure. Дополнительные сведения см. в разделе "Создание индекса и изменение индекса".
При создании или перестроении возобновляемого индекса в режиме "в сети" следует учитывать следующие рекомендации:
- Управление, планирование и разворачивание окна обслуживания индексов. Операцию создания и перестроения индексов в периоды обслуживания можно многократно приостанавливать и запускать повторно.
- Восстановление после сбоев при создании и перестроении индекса (например, при переходе на другую базу данных или нехватке места на диске).
- При приостановке операции с индексами исходный и вновь созданный индекс требуют места на диске и обновления во время операций DML.
- Появляется возможность усекать журналы транзакций во время операции создания или перестроения индекса.
- Параметр
SORT_IN_TEMPDB=ON
не поддерживается. - Отключенные индексы не поддерживаются.
Внимание
Повторное создание или перестроение индекса не требует открытия длительной транзакции, что позволяет усечение журнала во время этой операции и более эффективное управление пространством журналов. Новая структура позволяет хранить необходимые данные в базе данных вместе со всеми ссылками, необходимыми для перезапуска возобновляемой операции.
Как правило, нет разницы в производительности между возобновлением и неотрежимым перестроением онлайн-индекса. Для создания повторного индекса существует постоянная нагрузка, которая приводит к небольшой разнице в производительности между повторной и неустанной созданием индекса. В большинстве случаев это различие заметно только для небольших таблиц.
Если возобновляемый индекс обновляется, пока операция индексирования приостановлена:
- В основном для рабочих нагрузок чтения производительность незначительна.
- Для рабочих нагрузок с большим количеством обновлений можно столкнуться с снижением пропускной способности (наше тестирование показывает снижение пропускной способности менее чем на 10 %.
Как правило, нет разницы в качестве дефрагментации между возобновлением и неустранимым сетевым индексом создания или перестроения.
Примечание.
Хотя операция индекса в сети приостановлена, любая операция, требующая монопольной блокировки на уровне таблицы, содержащей приостановленный индекс, завершится ошибкой. Это чаще всего встречается с INSERT ... WITH (TABLOCK)
операциями. Возможны следующие ошибки:
Msg 10637, Level 16, State 1, Line 32: Cannot perform this operation on 'object' with ID (objectid) as one or more indexes are currently in resumable index rebuild state. Please refer to sys.index_resumable_operations for more details.
Чтобы устранить ошибку 10637, удалите TABLOCK
подсказку из транзакции или разместите операцию индекса и дождитесь завершения операции до повторной попытки транзакции.
Параметры режима "в сети" по умолчанию
Вы можете задать параметры по умолчанию для сети или возобновления на уровне базы данных, задав ELEVATE_ONLINE
ELEVATE_RESUMABLE
параметры конфигурации с заданной областью базы данных. Параметры по умолчанию позволяют избежать случайного выполнения операций, из-за которых таблица базы данных может стать недоступна. Оба варианта вызывают автоматическое повышение уровня определенных операций в режиме "в сети" или возобновление выполнения.
Вы можете задать любой параметр как , или OFF
с помощью команды ALTER DATABASE SCOPED CONFIGURATION. WHEN_SUPPORTED
FAIL_UNSUPPORTED
Для режима "в сети" и возобновляемого выполнения можно настроить разные значения.
ELEVATE_RESUMABLE
Оба ELEVATE_ONLINE
и только применяются к операторам DDL, поддерживающим синтаксис в сети и возобновление соответственно. Например, если вы пытаетесь создать XML-индекс с ELEVATE_ONLINE=FAIL_UNSUPORTED
, операция будет выполняться в автономном режиме, так как XML-индексы не поддерживают ONLINE=
синтаксис. Параметры влияют только на инструкции DDL, отправленные без указания параметра ONLINE или RESUMABLE. Например, отправляя инструкцию с ONLINE=OFF
помощью или RESUMABLE=OFF
, пользователь может переопределить FAIL_UNSUPPORTED
параметр и запустить инструкцию в автономном режиме и (или) неудержимо.
Примечание.
ELEVATE_ONLINE
и ELEVATE_RESUMABLE
не применяются к операциям XML-индекса.