Секционирование с помощью Data Dictionary и Database Administration Console
Перед тем как секционировать существующие таблицы, вы должны удостовериться в том, что:
- Таблицы, их индексы и LOB-поля размещаются в областях хранения второго типа (Type II). Если таблица не хранится в области второго типа, то она, её индексы и LOB-поля, должны быть перемещены в такую область. О том, как добавить в базу данных область хранения второго типа вы узнали на втором уроке. Перемещение данных может быть выполнено любым удобным для вас способом, например, с помощью утилиты PROUTIL TABLEMOVE или с применением процедуры DUMP & LOAD.
- Перед тем как создать политику секционирования, вы должны убедиться, что в таблице есть хотя бы один секционно-ориентированный индекс. Добавить индекс можно с помощью инструментария Data Dictionary. О том, как добавить такой индекс в таблицу, было рассказано на втором уроке.
Примечание. Если это не противоречит бизнес-логике, то такой индекс лучше всего сделать уникальным. Это повысит производительность при последующей миграции данных в секции таблицы.
Создание политики секционирования
Как уже отмечалось ранее, способ создания политики секционирования для существующей таблицы аналогичен способу, применяемому для новых таблиц. Тем не менее, при создании политики секционирования для существующей таблицы вам не придётся изначально явно создавать детали политики, OpenEdge сделает это автоматически, а именно:
- Создаст для таблицы initial composite partition (исходная композитная секция) – такая секция содержит существующие данные и является источником данных для процесса миграции, который будет выполнен позже.
- Проанализирует имеющиеся данные и определит одну или несколько описаний секций в зависимости от типа секционирования. Несмотря на то, что границы секций на этом шаге будут определены, данные, предназначенные для этих секций, всё ещё находятся в исходной композитной секции.
- Присвоит имена секциям на основе следующего шаблона: partition-policy-name-N. Здесь, N является целым числом, начиная с 1. Например, если имя политики секционирования это Order, то имя первой секции будет Order-1, второй Order-2 и так далее.
- Помечает описания секций как allocated и composite.
Описание OpenEdge-секций
Описания секций, которые OpenEdge создаст, зависят от типа выбранного вами табличного секционирования. Например:
Если для создания политики секционирования применяется … | то OpenEdge создаст… |
List partitioning | Несколько описаний секций, каждая из которых соответствует определенному значению столбца. |
Range partitioning | Одно описание секции, содержащей все записи, у которых значения секционного столбца меньше или равны верхней границы диапазона. |
List-list subpartitioning | Несколько описаний секций, каждая из которых соответствует определенной комбинации двух значений, по одному для каждого из столбцов списка. |
List-range subpartitioning | Несколько описаний секций, каждая из которых соответствует определенной комбинации двух значений, по одному для каждого из столбцов диапазона. |
Примечание. СУБД OpenEdge автоматически создаёт только одно описание секции для секционирования по диапазону. Также, при секционировании по списку и диапазону (list-range) создаётся только одно описание секции для столбца, определяющего список. Поэтому вы должны вручную создать дополнительные описания секции по диапазону (range) или по списку и диапазону (list-range), где значения секционных столбцов будут ниже верхней границы диапазона. О том, как добавлять новые секции (детали политики секционирования) вы уже знаете из предыдущего урока.
Пример секционирования по диапазону для существующей таблицы
Рассмотрим таблицу Order. В этой таблице есть секционно-ориентированный индекс OrderDate, в котором используется поле OrderDate.
Когда мы создадим политику секционирования для этой таблицы по полю и индексу OrderDate, OpenEdge автоматически проанализирует и создаст одну секцию, у которой значение верхней границы диапазона будет максимальным значением даты в поле OrderDate в рамках всей таблицы (в нашем примере это будет 2010-12-31). Иными словами, по умолчанию, эта секция будет содержать все данные существующей таблицы, у которых значение поля OrderDate меньше или равное указанной дате.
Далее мы можем определить дополнительные секции. Например, мы можем создать секцию для существующих данных, которая отделит данные за 2009 год, т.е. со значением ключа секции 2009-12-31. Или мы можем создать дополнительную секцию для новых данных, которые появятся в будущем.
Пример реализации list-range подсекционирования
Рассмотрим пример реализации list-range подсекционирования для существующей таблицы с помощью Data Dictionary и Database Administration Console.
Давайте разделим данные существующей таблицы Order в базе данных sports2000, используя в качестве ключа секции столбцы Carrier и OrderDate.
Первый шаг, который мы должны сделать – это создать секционно-ориентированный индекс. Для этого воспользуемся инструментарием Data Dictionary: Start -> All Programs -> Progress -> OpenEdge -> Data Dictionary.
В диалоговом окне Dictionary Startup выберем Connect to an Existing Database и щёлкнем Ok.
В диалоговом окне Connect Database щёлкаем Browse, переходим в каталог с базой данных и двойным щелчком выбираем .db-файл.
Далее щёлкаем по кнопке Options, выбираем режим подключения Multiple Users и щёлкаем по кнопке Ok.
В открывшемся инструментарии Data Dictionary выбираем таблицу Order и меню Create-> Index.
Создадим индекс CarrierOrderDateLocalIdx на основе столбцов Carrier и OrderDate. Обратите внимание на то, что возможность выбора типа индекса (поле Index Type) деактивирована. Просто создадим индекс. Локальным он станет на этапе, когда мы будем создавать политику секционирования для таблицы Order.
В качестве области хранения для этого индекса выберем из списка Area область OrderIndex1.
Поскольку мы реализуем подсекционирование типа list-range на основе столбцов Carrier и OrderDate, соответственно, мы сначала добавим в индекс в качестве лидирующих компонент поле Carrier, а затем OrderDate.
Щёлкаем по кнопке Create, а затем по кнопке Close для закрытия окна создания индексов.
В завершении, подтверждаем изменения в меню Edit -> Commit Transaction.
Закрываем инструментарий Data Dictionary: Database -> Exit.
Теперь мы готовы создать политику секционирования для таблицы Order. Для этого подключимся к Database Administration Console и откроем вкладку Database Connection через меню Database Administration -> Go to Database Administration.
Щёлкаем по подключению к базе данных sports2000, и, затем в секции Storage Management щёлкаем по ссылке Create partition policy, чтобы открыть страницу мастера создания политики секционирования Create Table Partition Policy.
Заполняем свойства политики секционирования:
- В поле Policy name вводим название политики Order.
- Содержимое списка Database connection оставляем без изменений.
- В поле Table щёлкаем по иконке поиска и выбираем из списка таблицу Order.
- В поле Default data area щёлкаем по иконке поиска и выбираем из списка область хранения OrderData1.
- В поле Default index area выбираем область хранения OrderIndex1.
- В поле Default LOB area выбираем область хранения OrderData1.
- В качестве правила размещения объектов выбираем Immediate – set new partitions to allocate space.
- Щёлкаем кнопку Next.
Теперь нам необходимо создать ключ секции:
- Так как мы создаем подсекции по типу list-range, то установим флаг Has range. Обратите внимание – если бы мы создавали подсекцию, не включающую диапазон, т.е. list-list, list-list-list и т.д., то флаг устанавливать не нужно.
- В области Partition fields щёлкаем по кнопке Add fields from index и выбираем индекс CarrierOrderDateLocalIdx. В результате столбцы Carrier и OrderDate, входящие в состав индекса, автоматический будут добавлены в качестве ключа индекса, а в область Partition aligned indexes будет добавлен CarrierOrderDateLocalIdx.
- Сделаем индекс CarrierOrderDateLocalIdx локальным, установив флаг в соответствующем поле.
Щёлкаем по кнопке Next для перехода на следующую страницу, где мы выполним анализ данных в таблице для автоматической идентификации секций.
Щёлкните по кнопке Load Details.
На основе анализа данных, OpenEdge определит, что будет создано семь секций. Щёлкните по кнопке Next для перехода на страницу редактирования деталей политики секционирования.
Здесь мы видим, что OpenEdge определил секции, представляющие весь спектр диапазона дат столбца OrderDate для каждого значения столбца Carrier. Обратите внимание, каждая секция помечена как Allocated и Composite. В случае необходимости, в будущем мы можем добавить новые секции.
Щёлкнем по кнопке Finish для сохранения политики секционирования.
Как вы могли убедиться, создать политику секционирования для существующей таблицы достаточно просто.