Задание 3. Создание политики секционирования с помощью ABL API
В этом задании необходимо с помощью ABL API for Table Partitioning Management создать политику секционирования на основе списка для таблицы tpPurchaseOrder. После чего создать десять деталей политики.
Обратите внимание, на первом занятии мы уже выделили пространство для областей хранения секций таблицы tpPurchaseOrder, сейчас мы должны их задействовать. В качестве шаблона для новой политики мы будем использовать существующую политику tpInvoice.
- Откройте политику секционирования tpInvoiсe:
- Создайте программу для генерации политики секционирования, которую мы будем использовать в качестве шаблона. Для этого щёлкните по кнопке Generate policy program. По умолчанию программа будет сохранена в файле с именем create_policy.p.
- Сохраните/скопируйте файл create_policy.p в каталог C:\OpenEdge\WRK\tablepartitioning под именем create_policy_PO.p.
- Откройте программе create_policy_PO.p в Progress Developer Studio for OpenEdge, либо в другом удобном для вас редакторе.
- Настройте новую политику секционирования в программе-шаблоне, путём замены значений следующих свойств:
Свойство
Значение
Service sportsco partitionPolicy tpPurchaseOrder partitionPolicy:Table tpPurchaseOrder partitionPolicy:HasRange no partitionPolicy:DefaultDataArea tpPurchaseOrderData1 partitionPolicy:DefaultIndexArea tpPurchaseOrderIndex1 partitionPolicy:DefaultLobArea tpPurchaseOrderData1 partitionPolicy:DefaultAllocation Immediate partitionPolicy:Fields:Add SupplierIDNum partitionPolicy:Indexes:Add SupplierIDNumLocalIdx Результат должен выглядеть так:
/* Start a service for the "sportsco" database. */ service = new DataAdminService("sportsco"). /* Instantiate a new IPartitionPolicy */ partitionPolicy = service:NewPartitionPolicy("tpPurchaseOrder"). assign partitionPolicy:Table = service:GetTable("tpPurchaseOrder") partitionPolicy:HasRange = no partitionPolicy:DefaultDataArea = service:GetArea("tpPurchaseOrderData1") partitionPolicy:DefaultIndexArea = service:GetArea("tpPurchaseOrderIndex1") partitionPolicy:DefaultLobArea = service:GetArea("tpPurchaseOrderData1") partitionPolicy:DefaultAllocation = "Immediate". /* Add InvoiceDate to the fields collection */ partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("SupplierIDNum")). /* Add InvoiceDateLocalIdx to the local index collection */ partitionPolicy:Indexes:Add(partitionPolicy:Table:Indexes:Find("SupplierIDNumLocalIdx")).
Сохраните изменения.
- астройте детали политики секционирования tpPurchaseOrder по следующей таблице:
Деталь политики
Значение Области хранения
tpPurchaseOrder-1 1 tpPurchaseOrderData1 tpPurchaseOrderIndex1
tpPurchaseOrderData1
tpPurchaseOrder-2 2 tpPurchaseOrderData2 tpPurchaseOrderIndex2
tpPurchaseOrderData2
tpPurchaseOrder-3 3 tpPurchaseOrderData1 tpPurchaseOrderIndex1
tpPurchaseOrderData1
tpPurchaseOrder-4 4 tpPurchaseOrderData2 tpPurchaseOrderIndex2
tpPurchaseOrderData2
tpPurchaseOrder-5 5 tpPurchaseOrderData1 tpPurchaseOrderIndex1
tpPurchaseOrderData1
tpPurchaseOrder-6 6 tpPurchaseOrderData2 tpPurchaseOrderIndex2
tpPurchaseOrderData2
tpPurchaseOrder-7 7 tpPurchaseOrderData1 tpPurchaseOrderIndex1
tpPurchaseOrderData1
tpPurchaseOrder-8 8 tpPurchaseOrderData2 tpPurchaseOrderIndex2
tpPurchaseOrderData2
tpPurchaseOrder-9 9 tpPurchaseOrderData1 tpPurchaseOrderIndex1
tpPurchaseOrderData1
tpPurchaseOrder-10 10 tpPurchaseOrderData2 tpPurchaseOrderIndex2
tpPurchaseOrderData2
Используйте в качестве шаблоны описание деталей политики секционирования tpInvoice. Для добавления описания новой детали скопируйте блок кода “Instantiate a new IPartitionPolicyDetail”.
Пример:
/* Instantiate a new IPartitionPolicyDetail */ partitionPolicyDetail = service:NewPartitionPolicyDetail("tpPurchaseOrder-1"). /* Add the new partitionPolicyDetail to the partitionPolicy's Details collection. */ partitionPolicy:Details:Add(partitionPolicyDetail). assign partitionPolicyDetail:IsReadOnly = no partitionPolicyDetail:IsSplitTarget = no partitionPolicyDetail:Description = "" partitionPolicyDetail:DefaultDataArea = service:GetArea("tpPurchaseOrderData1") partitionPolicyDetail:DefaultIndexArea = service:GetArea("tpPurchaseOrderIndex1") partitionPolicyDetail:DefaultLobArea = service:GetArea("tpPurchaseOrderData1") . /* Set the value for the policy detail */ partitionPolicyDetail:SetValue(1). /* SupplierIDNum as int */ /* Allocate partitions */ partitionPolicyDetail:Allocate(). ... ... ... /* Instantiate a new IPartitionPolicyDetail */ partitionPolicyDetail = service:NewPartitionPolicyDetail("tpPurchaseOrder-10"). /* Add the new partitionPolicyDetail to the partitionPolicy's Details collection. */ partitionPolicy:Details:Add(partitionPolicyDetail). assign partitionPolicyDetail:IsReadOnly = no partitionPolicyDetail:IsSplitTarget = no partitionPolicyDetail:Description = "" partitionPolicyDetail:DefaultDataArea = service:GetArea("tpPurchaseOrderData2") partitionPolicyDetail:DefaultIndexArea = service:GetArea("tpPurchaseOrderIndex2") partitionPolicyDetail:DefaultLobArea = service:GetArea("tpPurchaseOrderData2") . /* Set the value for the policy detail */ partitionPolicyDetail:SetValue(10). /* SupplierIDNum as int */ /* Allocate partitions */ partitionPolicyDetail:Allocate().
- Сохраните изменения.Предыдущее описание деталей политики секционирования можно реализовать по-другому, более компактно, тем самым сократив объём вашего кода. Следующий пример приведен только для информации:
define variable i as integer no-undo. do i = 1 to 10: /* Instantiate a new IPartitionPolicyDetail */ partitionPolicyDetail = service:NewPartitionPolicyDetail("tpPurchaseOrder-" + STRING(i)). /* Add the new partitionPolicyDetail to the partitionPolicy's Details collection. */ partitionPolicy:Details:Add(partitionPolicyDetail). assign partitionPolicyDetail:IsReadOnly = no partitionPolicyDetail:IsSplitTarget = no partitionPolicyDetail:Description = "" partitionPolicyDetail:DefaultDataArea = service:GetArea("tpPurchaseOrderData" + STRING(1 + (i - 1) mod 2)) partitionPolicyDetail:DefaultIndexArea = service:GetArea("tpPurchaseOrderIndex" + STRING(1 + (i - 1) mod 2)) partitionPolicyDetail:DefaultLobArea = service:GetArea("tpPurchaseOrderData" + STRING(1 + (i - 1) mod 2)) . /* Set the value for the policy detail */ partitionPolicyDetail:SetValue(i). /* SupplierIDNum as int */ /* Allocate partitions */ partitionPolicyDetail:Allocate(). end.
Но здесь стоит отметить, что подобный подход может быть применён только в случае, если свойства секций систематизированы, как в нашем примере.
- Выполните программу create_policy_PO.p с параметром старта клиентской сессии –D 1000:
- Для этого откройте командную строку PROENV: Start -> All Programs -> Progress -> OpenEdge -> Proenv
- Перейдите в каталог C:\OpenEdge\WRK\tablepartitioning.
- Выполните команду:
mpro sportsco -p create_policy_PO.p -D 1000
- С помощью Database Administration Console убедитесь, что десять деталей для политики секционирования tpPurchaseOrder созданы:
Задание завершено!
Подведение итогов урока
Второй урок завершён. Теперь вы умеете:
- Создавать новые секционированные таблицы с помощью инструментария Data Dictionary.
- Создавать новые политики секционирования и их детали с помощью:
- Database Administration Console
- ABL API for Table Partition Management
- Создавать новые секционированные таблицы, связанные с ними политики секционирования и их детали с помощью OpenEdge SQL.
На следующем уроке вы научитесь разделять таблицы с «живыми данными», а также разберётесь, как выполнять миграцию существующих данных во вновь созданные секции.