О фоновых операциях с индексом
В этом разделе описываются возникающие во время фоновой операции с индексами структуры, а также работа служб, связанных с этими структурами.
Оперативные структуры индексов
Для осуществления одновременной работы служб пользователей во время операций языка DDL необходимо во время фоновой операции с индексами использовать следующие структуры: индексы источника, назначения, существующие ранее индексы, а для кластеризованных — временный индекс сопоставления.
Индексы источника и существующие ранее индексы
Источник — это исходная таблица или данные кластеризованного индекса. Существующие ранее индексы — это любые некластеризованные индексы, связанные с исходной структурой. Например, если фоновая операция с индексами перестраивает кластеризованный индекс, у которого есть четыре связанных кластеризованных индекса, то источником является существующий кластеризованный индекс, а существующими ранее индексами являются некластеризованные индексы.
Существующие ранее индексы доступны множеству пользователей для одновременных операций выборки, вставки, обновления или удаления. К ним относятся операции массовой вставки (поддерживаемые, но не рекомендуемые к использованию) и неявного обновления при помощи триггеров и ограничений ссылочной целостности. Все существующие ранее индексы доступны для запросов и операций поиска. Из этого следует, что они могут быть выбраны оптимизатором запросов и, в случае необходимости, заданы в подсказках индекса.
Назначение
Назначение или назначения являются новым индексом (или кучей) или набором новых индексов, которые были либо созданы, либо перестроены. Пользовательские операции вставки, обновления и удаления над источником применяются к назначению компонентом SQL Server Database Engine во время операции с индексами. Например, если фоновая операция с индексами перестраивает кластеризованный индекс, то назначением является перестроенный кластеризованный индекс; компонент Database Engine не перестраивает некластеризованные индексы при перестроении кластеризованного.
При выполнении инструкции 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 до начала фазы завершения фоновой операции с индексами.
Работа служб со структурами назначения
В следующей таблице приведена работа служб со структурами назначения во время каждой фазы операции с индексами, а также соответствующие стратегии блокировки.
Фаза |
Работа служб назначения |
Блокировка назначения |
---|---|---|
Подготовка |
Создается новый индекс, доступный только для записи. |
IS (с намерением совмещаемого доступа) |
Сборка |
Вставляются данные из источника. Применяются пользовательские изменения (вставки, обновления, удаления), уже выполненные на источнике. Это действие прозрачно для пользователя. |
IS (с намерением совмещаемого доступа) |
Завершение |
Обновляются метаданные индекса. Индекс переводится в состояние чтения-записи. |
S (общая) или SCH-M (изменение схемы) |
До завершения операции с индексами назначение не доступно для инструкций SELECT, заданных пользователем.
После выполнения фаз подготовки и завершения хранящихся в кэше процедур планы запросов и обновлений становятся недействительными. В последующих запросах новый индекс будет использоваться.
Время жизни заданного в таблице курсора, использующегося в фоновых операциях с индексами, ограничено оперативными фазами индекса. На каждой фазе курсоры обновления являются недействительными. Доступные только для чтения курсоры становятся недействительными только после фазы завершения.
См. также