Об операциях с индексами в сети
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure базе данных SQL в Microsoft Fabric
В этом разделе описываются возникающие во время операции с индексами структуры в сети, а также работа служб, связанных с этими структурами.
Структуры индексов в сети
Для осуществления одновременной работы пользователей во время операций языка DDL необходимо во время операций с индексами в сети использовать следующие структуры: индекс источника и существующий индекс, индекс назначения, а для перестроения кучи или удаления кластеризованного индекса — временный индекс сопоставления.
Индексы источника и существующие индексы
Источник — это исходная таблица или данные кластеризованного индекса. Существующие индексы — это любые некластеризованные индексы, связанные с исходной структурой. Например, если операция с индексами в сети перестраивает кластеризованный индекс, с которым связаны четыре некластеризованных индекса, то источником является существующий кластеризованный индекс, а существующими индексами являются некластеризованные индексы.
Существующие индексы доступны пользователям для одновременных операций выборки, вставки, обновления или удаления. К ним относятся операции массовой вставки (поддерживаемые, но не рекомендуемые к использованию) и неявного обновления при помощи триггеров и ограничений ссылочной целостности. Все существующие индексы доступны для запросов и операций поиска. Из этого следует, что они могут быть выбраны оптимизатором запросов и в случае необходимости заданы в указаниях индекса.
Целевой объект
Назначение или назначения являются новым индексом (или кучей) или набором новых индексов, которые были либо созданы, либо перестроены. Операции вставки, обновления и удаления пользователей к источнику применяются ядро СУБД SQL Server к целевому объекту во время операции индекса. Например, если операция сетевого индекса перестроит кластеризованный индекс, целевой объект является перестроенным кластеризованным индексом; ядро СУБД не перестраивает некластеризованные индексы при перестроении кластеризованного индекса.
При выполнении инструкции SELECT в индексе назначения не производится поиск до подтверждения операции с индексами. Внутри системы индекс является доступным только для записи.
Временный индекс сопоставления
Операциям с индексами в сети, создающим, удаляющим или перестраивающим кластеризованный индекс, необходим также временный индекс сопоставления. Этот временный индекс используется одновременно выполняемыми транзакциям для определения того, какие записи должны быть удалены во время перестроения новых индексов при удалении или обновлении строк в базовой таблице. Данный некластеризованный индекс создается на том же этапе, что и новый кластеризованный индекс (или куча) и для него не требуется отдельной операции сортировки. Одновременно выполняемые транзакции поддерживают временный индекс сопоставления во всех операциях вставки, обновления или удаления.
Работа служб в сети с использованием индексов
Во время простой операции с индексами в сети, например во время создания кластеризованного индекса в неиндексированной таблице (куче), источник и назначение проходят три фазы: подготовка, сборка и завершение.
На следующем рисунке показан процесс создания исходного кластеризованного индекса в сети. Для исходного объекта (кучи) другие индексы не определены. Работа служб со структурами источника и назначения показана для каждой фазы; также показаны одновременные пользовательские операции выборки, вставки, обновления или удаления. Фазы подготовки, сборки, и завершения отображаются вместе с режимами блокировки, используемыми для каждой фазы.
Работа служб со структурами источника
В следующей таблице приведена работа служб со структурами источника во время каждой фазы операции с индексами, а также соответствующие стратегии блокировки.
Этап | Работа служб источника | Блокировки источника |
---|---|---|
Подготовка Короткая фаза |
Подготовка системных метаданных для создания пустой структуры индекса. Определяется моментальный снимок таблицы. То есть используется управление версиями строк для обеспечения согласованности считывания на уровне транзакций. Одновременные пользовательские операции записи в источник блокируются на короткий промежуток времени. Запрещаются все одновременные операции DDL, кроме операции создания множества некластеризованных индексов. |
S (совмещаемая) на таблицу* IS (с намерением совмещаемого доступа) INDEX_BUILD_INTERNAL_RESOURCE** |
Сборка Главная фаза |
Данные просматриваются, сортируются, сливаются и вставляются в назначение во время операций массовой загрузки. Одновременные пользовательские операции выборки, вставки, обновления и удаления применяются и к существовавшим индексам, и к новым создаваемым индексам. |
IS INDEX_BUILD_INTERNAL_RESOURCE** |
Завершение Короткая фаза |
Все незафиксированные транзакции обновления должны быть завершены до начала этой фазы. В зависимости от полученной блокировки все новые пользовательские транзакции записи или чтения блокируются на короткий промежуток времени до завершения этой фазы. Системные метаданные обновляются для замены источника на назначение. При необходимости источник может быть удален. Например, после перестроения или удаления кластеризованного индекса. |
INDEX_BUILD_INTERNAL_RESOURCE** S в таблице при создании некластеризованного индекса.* SCH-M (изменение схемы), если любая исходная структура (индекс или таблица) удалена.* |
* Операция индекса ожидает завершения любых незафиксированных транзакций обновления перед получением блокировки S или sch-M в таблице. Если выполняется длительный запрос, операция с индексами в сети ожидает завершения запроса.
** Блокировка ресурса INDEX_BUILD_INTERNAL_RESOURCE предотвращает одновременное выполнение операций языка описания данных DDL в источнике и существовавших структурах во время выполнения операции с индексами. Например, данная блокировка предотвращает одновременное перестроение двух индексов в одной таблице. Хотя данная блокировка ресурса связана с блокировкой Sch-M, она не предотвращает выполнение инструкций по обработке данных.
В предыдущей таблице показана одна совмещаемая (S) блокировка, установленная во время фазы сборки операции с индексами в сети, включающей в себя один индекс. При создании или перестроении кластеризованных и некластеризованных индексов в одной операции с индексами в сети (например во время создания исходного кластеризованного индекса в таблице, содержащей один или несколько некластеризованных индексов) во время фазы сборки создаются две краткосрочные совмещаемые (S) блокировки, а затем две долгосрочные блокировки с намерением совмещаемого доступа (IS). Одна блокировка S сначала устанавливается во время создания кластеризованного индекса, а затем при завершении его создания, а вторая краткосрочная блокировка S устанавливается при создании некластеризованных индексов. После создания некластеризованных индексов блокировка S снова сменяется блокировкой IS до начала фазы завершения операции с индексами в сети.
Дополнительные сведения о том, как используются блокировки и как можно управлять ими, см. в разделе arguments.
Работа служб со структурами назначения
В следующей таблице приведена работа служб со структурами назначения во время каждой фазы операции с индексами, а также соответствующие стратегии блокировки.
Этап | Работа служб назначения | Блокировка назначения |
---|---|---|
Подготовка | Создается новый индекс, доступный только для записи. | IS |
Сборка | Вставляются данные из источника. Применяются пользовательские изменения (вставки, обновления, удаления), уже выполненные на источнике. Это действие прозрачно для пользователя. |
IS |
Завершение | Обновляются метаданные индекса. Индекс переводится в состояние чтения/записи. |
S or Блокировка SCH-M |
До завершения операции с индексами назначение не доступно для инструкций SELECT, заданных пользователем.
После выполнения фаз подготовки и завершения хранящихся в кэше процедур планы запросов и обновлений становятся недействительными. В последующих запросах используется новый индекс.
Время жизни заданного в таблице курсора, использующегося в операциях с индексами в сети, ограничено оперативными фазами индекса. На каждой фазе курсоры обновления являются недействительными. Доступные только для чтения курсоры становятся недействительными только после фазы завершения.
См. также
Выполнение операций с индексами в оперативном режиме
Рекомендации по операциям с индексами в оперативном режиме