Разделение секций
Вероятно, что со временем у вас может появиться задача по разделению существующей секции на несколько секций меньшего размера. Наиболее частые причины для секционирования:
- Секция может очень сильно вырасти в размерах, в результате её необходимо разделить на более мелкие, более управляемые секции.
- Часть данных секции содержит устаревший данные, запросы к которым выполнятся всё реже и реже, и вы хотите выделить их в отдельную секцию с целью архивации.
В таблице, секционированной на основе списка или где реализовано подсекционирование только на основе списков, каждая секция соответствует либо конкретному значению столбца (list), либо сочетанию конкретных значений столбцов (list-list, list-list-list, и т.д.). По этой причине вы физически не можете выполнить дальнейшее разделение таких секций.
Тем не менее, в таблице, в которой секционирование выполнено на основе диапазона или в которой реализовано подсекционирование включающее диапазон, каждая секция содержит диапазон значений столбца секционирования. Соответственно, у вас есть возможность разделить такую секцию на секции меньшего размера.
Метод разделения секции аналогичен методу секционирования существующей таблицы. Фактически, вы должны:
- подготовить секцию к разделению;
- выполнить перемещение данных в новые секции.
Подготовка секций к разделению
Напоминаем, что для таблицы, которая секционирована по диапазону или в которой реализовано подсекционирование включающее диапазон, при определении политики секционирования создаётся только одна секция по диапазону. При этом позже, после перемещения данных, вы можете определить дополнительные секции.
Аналогично и для подготовки существующей секции к разделению вы явно определяете дополнительные секции. После разделения, исходная секция продолжает существовать как одна из секций, содержащих только данные соответствующие её верхней границе диапазона, в то время как вновь созданные секции теперь содержат необходимые данные.
Пример. Таблица Order секционирована по диапазону, и одна из её секций это Order_2014, т.е. содержит данные за весь 2014 год. Зададимся целью разделить эту секцию на четыре новые, т.е. поквартально. В этом случае вы должны определить три дополнительные секции: Order_Q1_14, Order_Q2_14 и Order_Q3_14. После разделения, у вас будет три новых этих секции плюс исходная секция Order_2014, которая будет содержать данные за четвёртый квартал 2014 года.
Если вы используете Database Administration Console для подготовки секции к разделению, вам необходимо добавить описание новых деталей политики секционирования к существующей политике, и затем пометить их как split-target. Вся необходимая информация для этого находится во втором уроке «СОЗДАНИЕ НОВЫХ СЕКЦИОНИРОВАННЫХ ТАБЛИЦ».
Если вы используете OpenEdge SQL для подготовки секции к разделению, вам необходимо использовать оператор SQL ALTER TABLE PREPARE FOR SPLIT. Синтаксис этого оператора аналогичен команде подготовке секций к миграции данных, за исключением того, что выражение PRO_INITIAL меняется на имя секции:
ALTER TABLE table-name PREPARE FOR SPLIT partition-name1 (PARTITION [partition-name2] VALUES <= (const) [area-spec], PARTITION [partition-name3] VALUES <= (const) [area-spec], ... );
Примечание. Секции должны быть расположены в возрастающем порядке, т.е. от нижней границы диапазона до верхней.
Пример. К таблице Order применено подсекционирование по списку и диапазону и одна из секций это Order_StandartMail_2014. Теперь мы хотим разделить эту секцию на три дополнительных секции. Следующий пример оператора SQL ALTER TABLE PREPARE FOR SPLIT подготавливает дополнительные секции и помечает их как split-target:
ALTER TABLE "PUB"."Order" PREPARE FOR SPLIT "Order_StandardMail_Q1_2014" (PARTITION "Order_StandardMail_Q1_2014" VALUES <= ('Standard Mail','03/31/2014'), PARTITION "Order_StandardMail_Q2_2014" VALUES <= ('Standard Mail','06/30/2014'), PARTITION "Order_StandardMail_Q3_2014" VALUES <= ('Standard Mail','09/30/2014') );
Перемещение существующих данных в новые секции
После подготовки секции к разделению вам необходимо переместить данные из неё в так называемые split-target секции. После завершения миграции split-target секции становятся регулярными. Обратите внимание на то, что исходная секция, продолжает существование в качестве одной из разделённых секций и содержит данные, соответствующие верхней границы её диапазона.
Для перемещения данных из исходной секции в split-target секцию применяется утилита PROUTIL PARTITIONMANAGE SPLIT. Синтаксис утилиты аналогичен тому, который используется при перемещении данных из исходной композитной секции, за исключением того, что параметр COMPOSITE INITIAL меняется на параметр PARTITION, с указанием имени секции:
proutil db-name -C partitionmanage split table table-name partition partition-name [useindex index-name] [recs numrecs]
Пример. В таблице Order у нас есть секция Order_2014, и мы подготовили для её разделения три дополнительные секции, пометив их как split-target. Следующей командой PROUTIL PARTITIONMANAGE SPLIT мы переместим данные из секции Order_2014 в split-target секции, при этом будет задействован локальный индекс OrderDateLocalIdx. За одну транзакцию будем переносить не более 200 записей. После перемещения секция Order_2014 будет содержать данные, у которых значение секционного столбца, отвечающего за диапазон, будут меньше или равны верхней границы диапазона секции; во вновь созданных секциях, будут содержаться все прочие данные.
proutil sportsco -C partitionmanage split table order partition order_2014 useindex orderdatelocalidx recs 200