Эффективная передача данных с использованием переключения секций

Секционирование данных позволяет эффективно и быстро управлять подмножествами данных и получать доступ к ним, сохраняя при этом целостность всего набора данных. Инструкцию Transact-SQL ALTER TABLE...SWITCH можно использовать для быстрой и эффективной передачи поднаборов данных следующими способами.

  • Включая таблицу в качестве секции в уже существующую секционированную таблицу.

  • Переключая секции из одной секционированной таблицы в другую.

  • Переназначая секцию, чтобы сформировать единственную таблицу.

Основные понятия о переключении секций см. в образце ReadMe_SlidingWindow. Дополнительные сведения об образцах см. в разделе Вопросы установки образцов кода и образцов баз данных SQL Server.

Общие требования при переключении секций

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

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

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

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

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

  • Исходная и целевая таблицы должны находиться в одной и той же файловой группе. Исходная и целевая таблицы в инструкции ALTER TABLE...SWITCH должны храниться в одной и той же файловой группе, так же как и их столбцы с большими значениями. Любые соответствующие индексы, секции индексов или индексированные представления секций также должны храниться в той же файловой группе. Однако она может отличаться от файловой группы для соответствующих таблиц или других соответствующих индексов.

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

Требования к структуре индексов и таблиц

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

  • Исходные и целевые таблицы должны использовать одну и ту же структуру столбца и порядок. У таблиц должны быть одинаковые столбцы с одинаковыми именами и одинаковым типом данных, длиной, параметром сортировки, точностью, масштабом, способностью принимать значение NULL и ограничениями PRIMARY KEY (если есть), а также должны совпадать значения ANSI_NULLS и QUOTED IDENTIFIER. Кроме того, столбцы должны быть заданы в одинаковом порядке. Свойство IDENTITY не учитывается.

    ПредупреждениеВнимание!

    Переключение секций может привести к появлению повторяющихся значений в столбцах IDENTITY целевой таблицы и пропусков значений столбцов IDENTITY в исходной таблице. Используйте команду DBCC CHECKIDENT для проверки значений идентификаторов таблиц и в случае необходимости исправьте эти значения.

  • Допустимость значений NULL столбцов секционирования должна совпадать. Исходные и целевые таблицы должны быть определены как NULL или NOT NULL. Если одна из таблиц не секционирована, то способность столбца, соответствующего столбцу секционирования другой таблицы, принимать значения NULL должна соответствовать столбцу секционированной таблицы.

    Важное примечаниеВажно!

    Для столбца секционирования секционированных таблиц рекомендуется задать значение NOT NULL. Рекомендуется также задать значение NOT NULL для несекционированных таблиц, являющихся исходными или целевыми для операций ALTER TABLE...SWITCH. Если секционированным столбцам присвоено значение NOT NULL, то любые ограничения CHECK, заданные для столбцов секционирования, не будут проверять значения NULL. Значения NULL обычно располагаются в крайней левой секции секционированной таблицы. Отсутствие ограничения NOT NULL для исходной и целевой таблиц может повлиять на работу ограничений CHECK, которые также определяются для столбца секционирования при переключении любой секции (кроме крайней левой) и в случае, когда параметр базы данных ANSI_NULLS имеет значение ON.

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

  • Свойства ROWGUID должны быть одинаковыми. Любой столбец, определенный свойством ROWGUID, должен соответствовать в другой таблице столбцу, также определенному свойством ROWGUID.

  • XML-столбцы должны иметь одну и ту же схему. Любые столбцы типа xml должны использовать одну и ту же коллекцию схем XML.

  • Настройки строки любых столбцов с типом данных TEXT, NTEXT и IMAGE должны быть одинаковыми. Дополнительные сведения об этих настройках см. в разделе Данные в строке.

  • У таблиц должны быть одни и те же кластеризованные индексы. Исходные и целевые таблицы должны иметь одни и те же кластеризованные индексы; кроме того, индексы не могут быть отключены перед переключением секционирования.

  • Некластеризованные индексы должны быть определены и быть одинаковыми. Любые некластеризованные индексы, определенные для целевой таблицы, также определяются для исходной таблицы, и они структурно идентичны с точки зрения уникальности, вложенных ключей и направления сортировки (ASC или DESC) для каждого столбца ключей индекса. Выключенные некластеризованные индексы являются исключением из этого требования.

Требования к ограничениям

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

  • Проверочные ограничения должны быть точно согласованы или применимы к источнику и цели. Любые ограничения CHECK, заданные для целевой таблицы, должны задаваться и для исходной таблицы: либо в виде точно совпадающих ограничений, либо в виде ограничений, применимых, например, в качестве поднабора, к ограничениям CHECK целевой таблицы.

  • Ограничения для столбца типа int должны быть одинаковыми или являться подмножеством. Любые проверочные ограничения для столбцов типа int в исходной таблице должны быть согласованы или должны существовать в виде подмножества ограничений для столбца типа int целевой таблицы. Например, если в целевой таблице для столбца Column1 есть ограничение типа int, которое указывает, что Column1 < 100, то соответствующий Column1 исходной таблицы должен иметь либо такое же ограничение, либо подмножество ограничения, значения которого содержатся в целевой таблице, например Column1 < 90 исходной таблицы. Ограничения CHECK, затрагивающие несколько столбцов, должны определяться с использованием того же синтаксиса.

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

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

    ПредупреждениеВнимание!

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

  • Исходные и целевые таблицы должны иметь одни и те же ограничения внешнего ключа. Если у целевой таблицы есть ограничения FOREIGN KEY, то исходная таблица должна иметь такие же внешние ключи, заданные для соответствующих столбцов, и эти ключи должны ссылаться на тот же первичный ключ, что и в целевой таблице. Внешним ключам исходной таблицы (их список можно получить в представлении каталога sys.foreign_keys) нельзя присвоить состояние is_not_trusted, если только соответствующий внешний ключ целевой таблицы тоже не находится в состоянии is_not_trusted. Дополнительные сведения об этой настройке см. в разделе Правила отключения индексов. SQL Server применяет ко вновь перемещенной секции все правила CASCADE, заданные для внешних ключей целевой таблицы.

Дополнительные требования при перемещении секций

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

  • Индексы должны быть выровнены с секциями таблицы. Любые индексы для исходной таблицы должны быть выровнены с исходной таблицей. Любые индексы для целевой таблицы должны быть выровнены с целевой таблицей. Исходная и целевая таблицы могут быть обе секционированы или несекционированы; кроме того, только одна из этих таблиц может быть секционирована. Дополнительные сведения о выравнивании индексов см. в разделе Дополнительные рекомендации по секционированным индексам.

  • К исходным таблицам с индексированным представлением применяются дополнительные ограничения и требования. Если целевая таблица в инструкции ALTER TABLE … SWITCH обладает индексированным представлением, см. раздел Переключение секций при наличии индексированных представлений, содержащий описание ограничений и примеры.

  • Полнотекстовые индексы не допускаются. Ни в исходной, ни в целевой таблице не может быть полнотекстовых индексов.

  • В целевой таблице не может быть XML-индексов. В целевой таблице не может быть XML-индексов.

  • Если исходная таблица имеет первичный ключ, то первичный и внешний ключи не могут быть определены. Между исходной и целевой таблицами не может быть активной связи «первичный-внешний ключ», в котором исходная таблица содержит первичный ключ.

  • Если целевая таблица имеет внешний ключ, то первичный и внешний ключи не могут быть определены. Между исходной и целевой таблицами не может быть активной связи «первичный-внешний ключ», в котором целевая таблица содержит первичный ключ.

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

  • Правила для целевой или исходной таблицы не допускаются. Ни в исходной, ни в целевой таблице не может быть заданных правил. Ограничения CHECK могут использоваться для исходных и целевых таблиц.

    ПримечаниеПримечание

    Правила используются для сохранения обратной совместимости. Предпочтение отдается реализации с помощью ограничений CHECK. Сведения об ограничениях CHECK см. в пункте Требования к ограничениям ранее в этом разделе.

  • Исходные и целевые таблицы не могут быть реплицированы. Ни исходная, ни целевая таблица не может быть источником репликации.

  • Перед переключением секции следует обладать необходимыми разрешениями для доступа к базе данных. Так как переключение секции использует инструкцию ALTER TABLE, то необходимо иметь для базы данных разрешения, соответствующие инструкции ALTER TABLE. Не обязательно, чтобы набор разрешений для исходной и целевой таблиц был одинаковым.

  • Триггеры не должны активироваться во время перемещения секций. Перемещение секций таблиц не активирует ни каскадных действий, ни триггеров INSERT, UPDATE или DELETE, и для него не требуется, чтобы исходная и целевая таблицы имели сходные определения триггеров.

    ПримечаниеПримечание

    При выполнении операции ALTER TABLE...SWITCH на обе таблицы, исходную и целевую, налагается блокировка изменений схемы, чтобы гарантировать, что никакие другие соединения во время изменений не будут ссылаться на эти таблицы. Дополнительные сведения о блокировках см. в разделе Режимы блокировки.

Перемещение секции таблицы