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

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

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

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

  • Путем удаления секции для создания единой таблицы.

Это удобно при необходимости регулярно добавлять новые данные в секционированную таблицу и удалять из нее старые данные. Эта операция по-разному влияет на большие или малые объемы данных. Если новые добавляемые данные нужно загрузить, очистить или преобразовать, то до добавления в качестве секции эти данные можно обрабатывать как отдельную сущность. Старые данные можно архивировать или направлять в хранилище. Независимо от размера коллекции передача будет быстрой и эффективной, поскольку, в отличие от инструкции INSERT INTO SELECT FROM, эта операция не перемещает данные физически. Изменяются только метаданные о расположении данных в той или иной секции.

Пример сценария

Adventure Works Cycles в сценарии секционирования образца базы данных База данных AdventureWorks2008R2 архивирует ее старые данные из таблицы TransactionHistory в таблицу TransactionHistoryArchive путем переключения секций между таблицами. При этом таблица TransactionHistory секционируется по полю TransactionDate. Диапазон значений для каждой секции равен одному месяцу. Таблица TransactionHistory содержит самые последние транзакции в году, а таблица TransactionHistoryArchive содержит более ранние транзакции. При подобном секционировании таблиц данные одного месяца годичной давности могут быть переданы из TransactionHistory в TransactionHistoryArchive помесячно.

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

  1. У таблицы TransactionHistoryArchive должна быть та же схема, что и у TransactionHistory. Кроме того, в таблице должна быть пустая секция, в которую будут записываться новые данные. В этом случае TransactionHistoryArchive будет секционированной таблицей, состоящей только из двух секций. Одна секция будет содержать все данные до сентября 2003 г., а другая — начиная с сентября 2003 г. и позже. Последняя секция будет пустой.

    Структура таблиц перед переключением секционирования

  2. Функция секционирования таблицы TransactionHistoryArchive изменена таким образом, что она разбивает пустую секцию на две, одна из которых получает новую секцию для данных за сентябрь 2003 г.

    Первый этап переключения секционирования

  3. Первая секция таблицы TransactionHistory со всеми данными за сентябрь 2003 г. переключается во вторую секцию таблицы TransactionHistoryArchive. Обратите внимание, что для таблицы TransactionHistory нужно указать проверочное ограничение, чтобы там не было данных с датой до 1 сентября (TransactionDate >= '9/01/2003'). Это ограничение гарантирует, что секция 1 будет содержать только данные за сентябрь 2003 г. и что она готова к переключению в секцию, содержащую только данные за сентябрь 2003 г. таблицы TransactionHistoryArchive. Кроме того, обратите внимание, что любые индексы, не выровненные по представляемым таблицам, должны быть удалены или отключены до переключения секций. Однако после переключения их можно создать повторно. Дополнительные сведения о выравнивании секционированных индексов см. в разделе Дополнительные рекомендации по секционированным индексам.

    Второй этап переключения секционирования

  4. Функция секционирования таблицы TransactionHistory изменяется таким образом, чтобы выполнять слияние первых двух секций в одну. Эта новая секция 1 содержит все данные, созданные в октябре 2003 г. Она будет готова к переключению в TransactionHistoryArchive в следующем месяце, если изменить существующее проверочное ограничение, обеспечивающее отсутствие в этой таблице данных старше 1 октября (TransactionDate >= '10/01/2003').

    Третий этап переключения секционирования

  5. Функция секционирования таблицы TransactionHistoryArchive снова изменяется для слияния второй только что добавленной секции с данными за сентябрь с первой секцией. Это действие переводит таблицу TransactionHistoryArchive обратно в начальное состояние, в котором ее первая секция содержит все данные, а вторая пуста.

    Четвертый этап переключения секционирования

  6. Функция секционирования таблицы TransactionHistory снова изменяется для разбиения ее последней секции на две, чтобы текущий месяц был отделен от предыдущего, а секция была готова принимать новые данные.

    Пятый этап переключения секционирования

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