Oracle {LIST} Разделение по программе и {RANGE} подразделение по DATE с интервалом - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь найти наилучший из возможных способов определения стратегии секционирования в Oracle 12c (12.2.0.1.0). Эта запись практически идентична моим требованиям. Тем не менее, я хочу знать, как лучше всего реализовать в Oracle 12c (12.2.0.1.0) версию.

Вот мой вопрос: у нас есть четыре (4) разных программы, счета для которых представлены внаша система.

Примерный объем представленных счетов в год выглядит следующим образом:Программа_1 ~ 3М в годПрограмма_2 ~ 1 млн. В годПрограмма_3 ~ 500К в годПрограмма_4 ~ 100K в год

Мой первоначальный мыслительный процесс заключается в создании PARTITION BY LIST (PROGRAM) и SUBPARTITION BY RANGE (BILL_SUBMISSION_DATE).

Я хотел бы использовать функцию интервалов оракула для SUBPARTITION, хотел бы знать, есть лиКакие-либо ограничения с этим подходом.

1 Ответ

0 голосов
/ 06 ноября 2019

Ваш подход к разбиению по PROGRAM и подразделению по BILL_SUBMISSTION_DATE звучит хорошо.

Я не проверял различия в производительности (я думаю, что они будут незначительными), но для кодирования INTERVALопция, на мой взгляд, упрощает запросы и обслуживание.

В следующем примере я использовал следующее предложение раздела таблицы:

partition by range (INVOICE_MONTH) interval (numtoyminterval(1, 'MONTH'))

Пример запроса с использованием имен разделов старого стиля, запрос раздела длясчет за апрель 2012 года, предполагая, что я создал раздел с именем INV201204 для этих счетов за этот месяц:

select * from MARK_INV_HDR
    partition ('INV201204');

И тот же запрос, используя INTERVAL автоматически сгенерированные разделы:

select * from MARK_INV_HDR 
    where invoice_month = to_date('2012-04', 'yyyy-mm');

Преимущество более позднего запроса в том, что мне не нужно знать соглашение об именах для разделов.

Чтобы удалить самый старый раздел, один запрос и один DDL:

select to_char(min(invoice_month), 'dd-Mon-yyyy') as min_inv_dt from MARK_INV_HDR;

MIN_INV_DT
-----------
01-Apr-2012

alter table mark_inv_hdr 
    drop partition for (TO_DATE('01-Apr-2012', 'dd-Mon-yyyy'))
    update global indexes;

РЕДАКТИРОВАТЬ:

Обновление: я забыл, что вы не можете использовать предложение INTERVAL на подраздел;спасибо пользователю 12283435 за напоминание. При более внимательном рассмотрении вопроса выясняется, что, вероятно, нет необходимости разбивать раздел на PROGRAM, так что просто один раздел по диапазону на BILL_SUBMISSION_DATE с предложением INTERVAL должен работать нормально.

Когда у вас есть небольшой набор значений, как вы делаете для PROGRAM, нет очевидных причин для его разбиения. Типичным примером разделения по спискам, приведенным в документации Oracle, является список регионов для глобального центра обработки вызовов, так что вы можете выполнять пакетные отчеты и обслуживание по определенным регионам в нерабочее время и т. Д. Вы можете иметь глобальный битовый индекс наPROGRAM, если вы не делаете много обновлений, если ваш запрос часто включает только один PROGRAM. (Обновление столбца с помощью растрового индекса на короткое время заблокирует таблицу.)

...