Поделиться через


Как работают операции с индексами в Сети

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

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

Структуры индексов в сети

Чтобы разрешить одновременную активность пользователей во время операции языка определения данных индекса (DDL), во время операции с индексом в сети используются следующие структуры: исходные и существующие индексы, целевые объекты, а также для перестроения кучи или удаления кластеризованного индекса в сети, временного индекса сопоставления.

  • Исходные и существующие индексы

    Источник — это исходная таблица или данные кластеризованного индекса. Существующие индексы — это все некластеризованные индексы, связанные с исходной структурой. Например, если операция сетевого индекса перестраивает кластеризованный индекс с четырьмя связанными некластеризованными индексами, источник является существующим кластеризованным индексом, а существующие индексы являются некластеризованными индексами.

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

  • Target

    Назначение или назначения являются новым индексом (или кучей) или набором новых индексов, которые были либо созданы, либо перестроены. Операции вставки, обновления и удаления данных в исходной базе данных применяются СУБД к целевому объекту во время индексации. Например, если операция сетевого индекса перестроит кластеризованный индекс, целевой объект является перестроенным кластеризованным индексом; Ядро СУБД не перестраивает некластеризованные индексы при перестроении кластеризованного индекса.

    Целевой индекс не используется до подтверждения операции индексации. Внутри системы индекс является доступным только для записи.

  • Временный индекс сопоставления

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

Действия индекса в Сети

Во время операции с индексом в сети, например создание кластеризованного индекса в неиндексной таблице (куче), исходный и целевой объект проходят три этапа: подготовка, сборка и окончательный.

Расширенное progress_report_online_index_operation событие можно использовать для мониторинга хода выполнения операции создания онлайн-индекса.

На следующем рисунке показан процесс создания исходного кластеризованного индекса в сети. Для исходного объекта (кучи) другие индексы не определены. Для каждого этапа отображаются действия исходной и целевой структур, а также операции пользователей SELECT, INSERT, UPDATE и DELETE. Фазы подготовки, сборки, и завершения отображаются вместе с режимами блокировки, используемыми для каждой фазы.

Схема действий, выполняемых во время операции индекса в сети.

Действия исходной структуры

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

Phase Source activity Source locks
Preparation

Short phase
Подготовка системных метаданных для создания пустой структуры индекса.

Определяется моментальный снимок таблицы. То есть используется управление версиями строк для обеспечения согласованности считывания на уровне транзакций.

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

Запрещаются все одновременные операции DDL, кроме операции создания множества некластеризованных индексов.
Разделяемые (S) в таблице1

Общие намерения (IS)

Блокировка объекта измененияSch-M схемы с подтипом INDEX_OPERATION ресурса 2
Build

Main phase
Данные сканируются, сортируются, объединяются и вставляются в целевой объект с помощью операций массовой загрузки.

Одновременные операции пользователей INSERT, UPDATE, DELETE и MERGE применяются как к существующим индексам, так и к новым индексам, находящимся в процессе построения.
Совместное намерение (IS)

Sch-Mблокировка объекта с ресурсным подтипом INDEX_OPERATION2
Final

Short phase
Все незафиксированные транзакции записи должны завершиться до начала этого этапа. В зависимости от полученной блокировки все новые транзакции чтения или записи пользователя блокируются в течение короткого периода до завершения этого этапа.

Системные метаданные обновляются для замены источника на назначение.

Источник удаляется при необходимости, например после перестроения или удаления кластеризованного индекса.
Sch-Mблокировка объекта с подтипом INDEX_OPERATION ресурса 2

Общий (S) в таблице при создании некластеризованного индекса.1

Sch-M Если любая исходная структура (индекс или таблица) удаляется. 1

1 Операция индексирования ожидает завершения любых незафиксированных транзакций записи перед получением блокировки S или Sch-M на таблице. Если выполняется длительный запрос, операция с индексами в сети ожидает завершения запроса. Если не используются блокировки с низким приоритетом, это может сформировать цепочку блокировок.

2 Блокировка Sch-M объекта с подтипом INDEX_OPERATION ресурса предотвращает выполнение параллельных операций языка определения данных (DDL) в исходной и предварительной структуре во время выполнения операции индекса. Например, данная блокировка предотвращает одновременное перестроение двух индексов в одной таблице. Хотя это блокировка Sch-M, она не предотвращает операторы манипуляции данными.

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

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

Деятельность целевой структуры

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

Phase Target activity Target locks
Preparation Создается новый индекс, доступный только для записи. Общие намерения (IS)
Build Вставляются данные из источника.

Изменения пользователей (вставки, обновления, удаления), примененные к источнику, также применяются к целевому объекту.

Это действие прозрачно для пользователя.
Общие намерения (IS)
Final Обновляются метаданные индекса.

Для индекса задано состояние чтения и записи.
Совместное использование (S) или изменение схемы (Sch-M)

Целевой объект недоступен для пользовательских запросов до завершения операции индексации.

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

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