Секционированные таблицы и индексы SQL Server 2005 - Особые режимы секционирования - Split, Merge и Switch

ОГЛАВЛЕНИЕ

 

Особые режимы секционирования - Split, Merge и Switch

В SQL Server 2005 для помощи в управлении секционированными таблицами введено несколько новых понятий. Поскольку секционирование применяется к большим таблицам для обеспечения масштабируемости и поддержания лучшей производительности этих таблиц, весьма вероятно, что количество секций, выбранное в момент создания функции секционирования, со временем изменится. Используя оператор ALTER TABLE с новой опцией "split" (“расщепление”), Вы можете добавить в таблицу новую секцию. Когда секция “расщепляется”, часть данных может быть перенесена в новую секцию, однако это не лучшее решение с точки зрения производительности. Ниже в этой статье будет приведен полный сценарий работы режима “split”.

Напротив, если необходимо удалить секцию используются режимы “switch” (“переключение”) и ”merge” (“слияние”). “Слияние” диапазонных секций выглядит как указание граничной точки, которую необходимо удалить. Если работа ведется только с данными определенного периода и регулярно проводится архивирование базы данных (например, ежемесячно), вы могли бы архивировать одну секцию данных (самый ранний месяц) после добавления новой секции. Например, Вы могли бы пожелать иметь доступ к данным только одного последнего года; тогда в конце каждого месяца вы бы “включали” новый (текущий) месяц, и затем “выключали” бы самый ранний месяц, таким образом, проводя различия между read/write OLTP данными текущего месяца и read-only данными предыдущих месяцев, предназначенными для анализа. Однако, прежде чем Вы объедините граничную точку Вы должны выключить ее (связанные с ней) ассоциированные данные, иначе слияние может стать дорогостоящей операцией. Существует специальная методика, позволяющая добиться при этом наибольшей эффективности. Понятия “switch”, “merge” и “split” только на первый взгляд несколько сложными.

В данном сценарии у вас есть read-only доступ к таблице с данным за последний год. В настоящее время в этой таблице содержатся данные с сентября 2003 по август 2004. Данные за текущий месяц, сентябрь 2004, находится в другой базе данных, оптимизированной для производительности OLTP (операций реального времени). В read-only версии таблицы имеется 13 секции: двенадцать секций, которые содержит данные (сентябрь 2003 - августа 2004), и одна последняя пустая секция (помните, что диапазонные секции включают весь диапазон значений – от бесконечно малого до бесконечно большого). Таблица могла бы содержать определение CHECK constraint, для того чтобы ограничить OrderDate значениями с 1 сентября 2003 по 1 сентября 2004; данное ограничение позволит эффективно держать последнюю секцию пустой.


Рисунок 5: Границы диапазонных секций - перед загрузкой данных/архивацией

Когда начинается октябрь (в базе данных OLTP), необходимо переместить данные сентября в секционированную таблицу, используемую для анализа. Включение/выключение секций в таблицу - очень быстрый процесс, к тому же, вся подготовительная работа может быть выполнена из-за пределов секционированной таблицы. Этот сценарий в подробностях описывается в учебном примере, который будет рассмотрен чуть ниже. Его основная идея заключается в использовании “каскадных таблиц”, которые в конечном счете станут секциями в секционированной таблице (“включение” таблицы, становящейся секцией в секционированной таблице) или будут хранить устаревшие данные таблицы (“выключение” секции, становящейся автономной таблицей).

На Рисунке 6 показано “выключение” секции, становящейся отдельной не секционированной таблицей в той же файловой группе, что и основная таблица. Поскольку эта “несекционированная таблица” уже существует внутри той же файловой группы (и это является очень важным моментом), SQL Server может реализовать это "переключение" как простое изменение метаданных. Выключение секции происходит за считанные секунды, поскольку SQL Server должен всего-навсего изменить метаданные, в отличие от удаления, которое могло бы занять часы и создать блокировки на больших таблицах. Как только эта секция "выключена", у вас все еще будет оставаться 13 секций: первая (самая старая) секция теперь пуста и последняя (самая свежая, также пустая) секция должна быть теперь “расщеплена”.


Рисунок 6: Выключение секции

Для того чтобы удалить первую (старшую) секцию (сентябрь 2003), необходимо воспользоваться новой опцией “слияния” оператора ALTER TABLE - “merge” (см. Рисунок 7). “Сливая” секции, вы фактически удаляете граничную точку между ними, и, следовательно, устраняете одну из секций (в данном случае сокращая количество секций до 12). Слияние секции будет очень быстрой операцией в том случае, если никакие строки данных не должны быть перемещены; в нашем случае, поскольку первая секция пуста, никакие записи не перемещаются (из первой секции во вторую). Если бы первая секция НЕ была пуста, то при слиянии данные пришлось бы перемещать из первой секции во вторую, и это было бы очень дорогостоящей операцией. Впрочем, в весьма распространенном сценарии “sliding window” (“Скользящее Окно”) это никогда не должно произойти, поскольку Вы всегда будете объединять пустую секцию с активной секцией, и соответственно никакие записи перемещаться не будут.


Рисунок 7: Слияние секций

И наконец случай, когда новая таблица должна быть включена в секционированную таблицу. Помните, что для того чтобы осуществить включение секции в секционированную таблицу путем простого изменения метаданных, вся работа по загрузке данных и созданию индексов уже должна быть произведена в новой таблице - вне границ секционированной таблицы. Для включения новой секции в таблицу сначала необходимо “расщепить” последний (самый новый, пустой) диапазон на две секции. Кроме того, вам необходимо перестроить ограничение целостности таблицы под требования нового диапазона. Секционированная таблица будет включать 13 секций. Последняя секция в сценарии “Скользящее Окно” с LEFT-функцией секционирования будет всегда оставаться пустой.


Рисунок 8: Расщепление Секции

И наконец, недавно загруженные данные включаются в 12-ую секцию – в качестве данных за сентябрь 2004.


Рисунок 9: Включение Секции

В результате мы получаем таблицу такого вида:


Рисунок 10: Границы диапазонных секций - после загрузки данных/архивации

Важно знать, что split и merge – это атрибуты оператора ALTER PARTITION FUNCTION, а switch – это атрибут оператора ALTER TABLE. Кроме того, только одна секция может быть добавлена или удалена единовременно. Если в диапазонную секционированную таблицу требуется добавить или удалить сразу несколько секции, то тогда наиболее оптимальным способом балансировки данных (вместо балансировки целой таблицы для каждого расщепления) может послужить создание новой секционированной таблицы – использование новой функции и схемы секционирования и затем перемещение данных в новую секционированную таблицу. Для “перемещения” данных сначала скопируйте их, используя оператор INSERT newtable SELECT … FROM oldtable, а затем удалите исходные таблицы. Будьте осторожны, не потеряйте данные, предотвращая пользовательские (или любые другие) модификации во время этого процесса.
Более полную информацию вы сможете найти в BOL, в разделах ALTER PARTITION FUNCTION and ALTER TABLE.