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

Изменения: 12 декабря 2006 г.

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

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

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

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

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

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

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

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

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

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

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

  • У таблиц должны быть одинаковые столбцы, с одинаковыми именами и одинаковым типом данных, длиной, параметром сортировки, точностью, масштабом, способностью принимать значение NULL и ограничениями первичных ключей; также должны совпадать значения ANSI_NULLS и QUOTED IDENTIFIER. Кроме того, столбцы должны быть заданы в одинаковом порядке. Свойство IDENTITY не учитывается.
    ms191160.Caution(ru-ru,SQL.90).gifВнимание!
    Переключение секций может привести к появлению повторяющихся значений в столбцах IDENTITY целевой таблицы и пропусков значений столбцов IDENTITY в исходной таблице. Используйте команду DBCC CHECKIDENT для проверки значений идентификаторов таблиц и в случае необходимости исправьте эти значения.
  • Способность столбцов секционирования принимать значения NULL должна совпадать. То есть оба должны быть определены, как NULL или NOT NULL. Если одна из таблиц не секционирована, то способность столбца, соответствующего столбцу секционирования другой таблицы, принимать значения NULL, должна соответствовать свойствам последнего.
    ms191160.note(ru-ru,SQL.90).gifВажно!
    Рекомендуется задать значение NOT NULL для столбца секционирования секционированных таблиц, а также несекционированных таблиц, являющихся исходными или целевыми для операций ALTER TABLE...SWITCH. В результате любые ограничения CHECK, заданные для столбцов секционирования, не будут проверять значения NULL. Значения NULL обычно располагаются в крайней левой секции секционированной таблицы. Если при переключении любой секции (кроме крайней левой) параметр базы данных ANSI_NULLS имеет значение ON, отсутствие ограничения NOT NULL для исходной и целевой таблиц может повлиять на работу ограничений CHECK, также определенных для столбца секционирования.
  • Если их соответствующие ключи секций представляют собой вычисляемые столбцы, то синтаксис определяющих эти столбцы выражений должен совпадать, и оба вычисляемых столбца должны быть материализованы.
  • Любой столбец, заданный со свойством ROWGUID, должен соответствовать в другой таблице столбцу, также определенному со свойством ROWGUID.
  • Любые столбцы типа xml должны использовать одну и ту же коллекцию схем XML.
  • Настройки размещения данных в строке для любых столбцов типов text, ntext или image также должны совпадать. Дополнительные сведения об этих настройках см. в разделе Данные в строке.
  • У таблиц должны быть одни и те же кластеризованные индексы. Эти индексы нельзя отключить.
  • Любые некластеризованные индексы, определенные для целевой таблицы, также определяются для исходной таблицы, и они структурно идентичны с точки зрения уникальности, вложенных ключей и направления сортировки (ASC или DESC) для каждого ключевого столбца индексов. Выключенные некластеризованные индексы являются исключением из этого требования.

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

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

Например, если в целевой таблице есть ограничение на Столбец1 типа int, которое указывает, что Столбец1<100, то соответствующий Столбец1 исходной таблицы должен либо иметь такое же ограничение, либо ограничение, значения которого есть подмножество ограничений целевой таблицы (например: Столбец1<90).

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

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

ms191160.Caution(ru-ru,SQL.90).gifВнимание!
Следует избегать преобразования типов данных в определениях ограничений. Ограничения, которые включают в себя явное или неявное преобразование типов и которые заданы для таблиц, служащих источниками при переключении секций, могут вызвать завершение инструкции ALTER TABLE...SWITCH с ошибкой.

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

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

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

  • Любые индексы как исходной, так и целевой таблицы должны быть выровнены относительно таблицы в том случае, если одна или обе таблицы секционированы.
  • Ни в исходной, ни в целевой таблице не может быть полнотекстовых индексов.
  • В целевой таблице не может быть XML-индексов.
  • Между исходной и целевой таблицей не может быть активного отношения «первичный/внешний ключ», в котором исходная содержит первичный ключ.
  • Между исходной и целевой таблицей не может быть активного отношения «первичный/внешний ключ», в котором целевая содержит первичный ключ.
  • На исходную таблицу не должны ссылаться внешние ключи другой таблицы.
  • Исходная и целевая таблицы не могут участвовать в представлении со связыванием схем. Следовательно, для них нельзя задавать индексированные представления.
  • Ни в исходной, ни в целевой таблице не может быть заданных правил.
    ms191160.note(ru-ru,SQL.90).gifПримечание.
    Правила используются для сохранения обратной совместимости. Предпочтение отдается реализации с помощью ограничений CHECK. Сведения об ограничениях CHECK см. в пункте Требования к ограничениям ранее в этом разделе.
  • Ни исходная, ни целевая таблица не может быть источником репликации.
  • Переключение секции подразумевает выполнение инструкции ALTER TABLE. Следовательно, необходимо иметь для базы данных разрешения, соответствующие инструкции ALTER TABLE. Не обязательно, чтобы набор разрешений для исходной и целевой таблиц был одинаковым.

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

ms191160.note(ru-ru,SQL.90).gifПримечание.
При выполнении операции ALTER TABLE...SWITCH на обе таблицы, исходную и целевую, налагается блокировка изменений схемы, чтобы гарантировать, что никакие другие соединения во время изменений не будут ссылаться даже на метаданные таблиц. Дополнительные сведения о блокировках см. в разделе Режимы блокировки.

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

См. также

Основные понятия

Проектирование секций для управления вложенными наборами данных

Другие ресурсы

DBCC CHECKIDENT (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
Readme_SlidingWindow

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

12 декабря 2006 г.

Новое содержимое

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

14 апреля 2006 г.

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