Создание политик секционирования и деталей с помощью ABL API
Процесс секционирования может быть автоматизирован при помощи ABL API for Table Partition Management.
ABL API for Table Partition Management – это набор пользовательских ABL-классов и интерфейсов, которые позволяют получать доступ и обновлять схему базы данных.
Чтобы упростить вам задачу, OpenEdge позволяет использовать программу генерации политики секционирования как шаблон, который вы можете модифицировать для своих нужд. Для создания этой программы вы должны иметь в таблице политику секционирования и, по крайней мере, одну деталь политики секционирования.
Чтобы создать политику секционирования и её детали с помощью сгенерированной программы-шаблона, необходимо:
- С помощью Database Administration Console сгенерировать программу политики секционирования на основе существующей политики.
- Настроить значения свойств новой политики секционирования и связанных с ней деталей.
- Выполнить программу на необходимой базе данных.
Генерация программы-шаблона
Перед тем как сгенерировать программу, которую вы будете использовать в качестве шаблона[1], вы должны создать хотя бы одну политику секционирования и деталь политики секционирования в любой таблице. Простейший способ сделать это – использовать Database Administration Console.
[1] Далее, для упрощения, мы будем использовать термин «программа-шаблон»
Программа политики описывает структуру политики секционирования, основанную на существующей политике в таблице БД. Код программы генерируется из мастера Create Table Partition Policy в Database Administration Console. При этом необходимо, чтобы были выполнены следующие условия:
- Политика секционирования должна существовать.
- Должны быть указаны секционные столбцы и индексы.
- Должны быть созданы и настроены все свойства деталей политики секционирования.
Процесс для генерации программ выглядит следующим образом:
- В Database Administration Console выберите в меню Database Administration -> Database Connections.
- Щёлкните по необходимому подключению к базе данных на левой панели вкладки Database Administration. На правой панели отобразится информация об этой базе, включая секцию Storage Management.
- В секции Storage Management щёлкните по Partition policies. Откроется страница Table Partition Policies.
- Щёлкните по имени политики секционирования, на основе которой вы хотите сгенерировать программу. Откроется страница Edit Table Partition Policy.
- Щёлкните по кнопке Generate policy program. Программа сгенерируется и автоматически сохранится на диск под именем create_policy.p.
Редактирование программы-шаблона
После генерации программы-шаблона, необходимо изменить некоторые значения для создания новой политики секционирования и связанных деталей секционирования. Если вам необходимо добавить несколько новых политик, то просто продублируйте и измените соответствующие части кода внутри шаблона.
Что необходимо изменить в программе шаблона:
- Укажите базу данных для DataAdminService.
- Укажите значения свойств новой политики секционирования.
- Укажите значения свойств секционных полей и индексов.
- Укажите значения свойств новых деталей политики секционирования.
- Продублируйте код для создания других политик секционирования и их деталей.
Примечание. Программа для генерации политик использует ООП. В рамках этого курса вы узнаете только о том, как редактировать значения для определения политик секционирования и их деталей. Для того чтобы получить более расширенное представление об ABL API for Table Partition Management, и о том, как это работает, смотрите документацию к OpenEdge, книга «Progress OpenEdge Programming Interfaces».
База данных для DataAdminService
Программа-шаблон начинается с создания экземпляра DataAdminService для базы данных.
Если политика секционирования, на основе которой генерировалась программа-шаблон, принадлежала той же базе данных, в которой будет создаваться новая политика секционирования, то это значение изменять не нужно, база данных уже указана правильно.
Если вы собираетесь создать новую политику секционирования и связанные с ней детали для другой базы данных, то в программе-шаблоне вам необходимо перейти на строку, в которой создаётся экземпляр DataAdminService, и изменить имя базы данных.
Пример строки DataAdminService для базы данных sportsco:
// Start a service for the "sportsco" database service = NEW DataAdminService("sportsco").
Значения свойств новой политики секционирования
Напомним, при создании политики секционирования с помощью Database Administration Console, было необходимо указать значения свойств политики.
В программе-шаблоне необходимо указать значения следующих свойств политики:
Для свойства… |
укажите … |
NewPartitionPolicy() | Имя политики секционирования |
GetTable() | Имя секционируемой таблицы |
HasRange | Yes (используется диапазон) или No |
DefaultDataArea() | Область хранения по умолчанию для данных |
DefaultIndexArea() | Область хранения по умолчанию для индексов |
DefaultLobArea() | Область хранения по умолчанию для LOB-полей |
DefaultAllocation | “Immediate” или “None” |
Пример кода:
// Instantiate a new IPartitionPolicy partitionPolocy = service:NewPartitionPolicy("order"). ASSIGN partitionPolicy:Table = service:GetTable("Order") partitionPolicy:Description = "Test policy" partitionPolicy:HasRange = YES partitionPolicy:DefaultDataArea = service:GetArea("Order") partitionPolicy:DefaultIndexArea = service:GetArea("Order") partitionPolicy:DefaultLobArea = service:GetArea("Order") partitionPolicy:DefaultAllocation = "None".
Значения свойств секционных полей и индексов для секционирования
Напомним, когда вы создаёте политику секционирования с помощью Database Administration Console, вы добавляете секционные поля и секционно-ориентированные индексы в политику, как показано на рисунке:
В программе-шаблоне всё, что вам необходимо, это указать значение двух свойства: Fields и Indexes.
Первый пример. Поскольку свойству HasRange присвоено значение yes, то код реализует секционирование по диапазону (Range) используя поле OrderDate и локальный индекс OrderDateLocalIdx:
... partitionPolicy:HasRange = yes. ... partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("OrderDate")). partitionPolicy:Indexes:Add(partitionPolicy:Table:Indexes:Find("OrderDateLocalIdx")). ...
Второй пример. Свойство HasRange получило значение no, это значит, что мы создаем политику секционирования на основе списка, и согласно примеру, секции будут созданы на основе поля Country и с локальным индексом CountryLoaclIdx:
... partitionPolicy:HasRange = no. ... partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("Country")). partitionPolicy:Indexes:Add(partitionPolicy:Table:Indexes:Find("CountryLocalIdx")). ...
Значения свойств секционных полей и индексов для подсекционирования
Для настройки подсекционирования вы должны определить отдельные строки со свойством Fields для каждого секционного столбца. Точно также, если вам необходимо указать несколько индексов, вы должны определить соответствующее количество строк для свойства Indexes.
Первый пример. Необходимо создать подсекционирование с подходом list-range по полям Carrier и OrderDate. Для этого в свойстве HasRange устанавливаем значение yes. Создаём две строки со свойством Fields и строку с локальным индексом CarrierDateLoaclIdx. Обратите внимание на порядок строк. В первой строке указывается поле Carrier (List), а во второй поле OrderDate (Range). Напомним, в подсекционировании с использованием диапазона поле с типом range всегда должно быть последним.
... partitionPolicy:HasRange = yes. ... partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("Carrier")). partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("OrderDate")). partitionPolicy:Indexes:Add(partitionPolicy:Table:Indexes:Find("CarrierDateLocalIdx")). ...
Второй пример. Необходимо создать подсекционирование с подходом list-list по полям Carrier и Country. Для этого в свойстве HasRange устанавливаем значение no. Создаем две строки со свойством Fields и строку с локальным индексом CarrierCountryLoaclIdx.
... partitionPolicy:HasRange = no. ... partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("Carrier")). partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("Country")). partitionPolicy:Indexes:Add(partitionPolicy:Table:Indexes:Find("CarrierCountryLocalIdx")). ...
Значения свойств новых деталей политики секционирования
Когда вы создаёте детали политики секционирования в Database Administration Console, вы указываете значения свойств каждой политики так, как показано на рисунке:
В программе-шаблоне вам также необходимо указать эти свойства для каждой детали:
Для свойства… |
укажите … |
NewPartitionPolicyDetail() | Имя детали политики секционирования |
IsReadOnly | no, секция имеет статус READ-WRITE
yes, секция имеет статус READ-ONLY |
IsSplittarget | No, если вы собираетесь создать секцию для новой секционированной таблицы.
Yes, если вы необходимо переместить данные из существующей секционированной таблицы в новую секцию. |
Description | Описание детали политики секционирования |
DefaultDataArea() | Область хранения по умолчанию для данных |
DefaultIndexArea() | Область хранения по умолчанию для индексов |
DefaultLobArea() | Область хранения по умолчанию для LOB-полей |
SetValue() | Конкретное значение для List
Верхняя граница диапазона для Range Если вы реализуете подсекционирование, то допускается указание двух значений: значение поля и целое число, указывающее на положение поля в подсекции. |
Пример кода:
... partitionPolicy:HasRange = yes ... partitionPolicyDetail = service:NewPartitionPolicyDetail("tpInvoice_2019"). partitionPolicy:Details:Add(partitionPolicyDetail). assign partitionPolicyDetail:IsReadOnly = no partitionPolicyDetail:IsSplitTarget = no partitionPolicyDetail:Description = "" partitionPolicyDetail:DefaultDataArea = service:GetArea("tpInvoiceData1") partitionPolicyDetail:DefaultIndexArea = service:GetArea("tpInvoiceIndex1") partitionPolicyDetail:DefaultLobArea = service:GetArea("tpInvoiceData1"). partitionPolicyDetail:SetValue(12/31/2019). partitionPolicyDetail:Allocate(). ...
Пример создания новых деталей политики секционирования для list-range
Давайте разберём на примере создание детали с именем tpOrder_2019 для политики tpOrder. Поскольку мы собираемся реализовать подсекционирование list-range, мы присвоим свойству HasRange значение yes, а в качестве секционных полей используем Carrier и OrderDate.
В основном, свойства для подсекционирования идентичны свойствам, применяемым в обычном секционировании. Тем не менее, для свойства SetValue необходимо указать два значения: значение поля и целое число, которое указывает позицию поля в подсекционировании.
Чтобы ваш код был более читабельным, рекомендуем размещать строки со свойством SetValue в порядке, соответствующем подсекции. В этом примере строка, содержащая значение поля Carrier («Standard Mail») указана первой, а строка с полем OrderDate, определяющим диапазон – вторая.
... partitionPolicy:HasRange = yes ... partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("Carrier")). partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("OrderDate")). partitionPolicy:Indexes:Add(partitionPolicy:Table:Indexes:Find("CarrierOrderdate")). partitionPolicyDetail = service:NewPartitionPolicyDetail("tpOrder_2019"). partitionPolicy:Details:Add(partitionPolicyDetail). assign partitionPolicyDetail:IsReadOnly = no partitionPolicyDetail:IsSplittarget = no partitionPolicyDetail:Description = "" partitionPolicyDetail:DefaultDataArea = service:GetArea("tpOrderDataArea1") partitionPolicyDetail:DefaultIndexArea = service:GetArea("tpOrderIndexArea1") partitionPolicyDetail:DefaultLobArea = service:GetArea("tpOrderDataArea1"). partitionPolicyDetail:SetValue("Standard Mail",1). partitionPolicyDetail:SetValue(12/31/2019,2). partitionPolicyDetail:Allocate(). ...
Добавление кода для создания дополнительных политик секционирования и их деталей
Мы разобрались, как отредактировать программу-шаблон для добавления новой политики и связанной с ней детали. А что же необходимо исправить в шаблоне, если нам необходимо за один раз создать несколько новых политик и их деталей для разных таблиц? Для этого необходимо продублировать соответствующие секции кода и изменить значения необходимых свойств. Обратите внимание, все необходимые переменные, используемые для определения политик и деталей, описаны в начале программы-шаблона и являются многократно используемыми. То есть, вам не нужно определять новые переменные для каждой новой политики секционирования и её деталей.
Для того чтобы в программе-шаблоне описать больше политик секционирования и деталей, следуйте следующим рекомендациям:
- Если необходимо добавить одну и более деталей к существующей политики, продублируйте следующую секцию кода и отредактируйте значения свойств каждой новой детали:
partitionPolicyDetail = service:NewPartitionPolicyDetail("policy-detail"). ... partitionPolicyDetail:Allocate().
- Если необходимо внести в программу-шаблон более одной политики секционирования, продублируйте следующую секцию кода уже описанной политики и её деталей, после чего измените значения необходимых свойств:
partitionPolicy = service:NewPartitionPolicy("policy-name"). ... service:CreatePartitionPolicy(partitionPolicy).
Запуск программы-шаблона
После того, как программа для генерации политик секционирования и их деталей была должным образом подготовлена, необходимо запустить её для требуемой базы данных.
Обратите внимание, в строке запуска программы необходимо установить параметр Directory Size (-D) не менее 1000. По умолчанию значение этого параметра равно 100. Если вы оставите этот параметр по умолчанию, то вы можете получить следующее сообщение:
-D limit has been exceeded; automatically increasing to 150. (5410)
Пример команды для создания секций для таблицы Order в базе данных sportsco:
mpro sportsco -p create_policy_order.p -D 1000