Oracle: использование автоматического разбиения списка с разбиением диапазона - PullRequest
3 голосов
/ 16 мая 2019

Я хочу использовать метод разделения для разделения моей таблицы на два измерения:

  1. Первое измерение - это список ключей. Список может расти со временем, и я не хочу, чтобы администратор БД добавлял разделы, если список ключей будет расширен. Поэтому я хочу использовать Автоматическое разбиение списка .

  2. Второе измерение - дневной диапазон столбца даты.

Вот мой пример, который дает мне ORA-14179

CREATE TABLE PartitionedTable
( 
  id              number,
  PartitionKey    number,
  created         date
) 
PARTITION BY LIST (PartitionKey) AUTOMATIC
SUBPARTITION BY RANGE (created) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
( PARTITION p_PartitionKey VALUES (1)
  ( SUBPARTITION p_created VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy'))
  )
);

Я использую Oracle Database 12c Enterprise Edition, выпуск 12.2.0.1.0 - 64-разрядная версия

Есть ли вариант, как я могу создать эту двумерную секционированную таблицу с минимальными усилиями, если будут вставлены новые ключи и новые даты?

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Автоматическое разбиение по интервалам и спискам не поддерживается на уровне подразделов.
Может быть, лучше сделать это без подразделов.Также можно использовать несколько ключей или виртуальные столбцы для автоматическое разбиение списка ,Рассмотрим следующую демонстрацию:

create table parttab (
    id number, key number, created date, 
    partkey varchar (16) as (to_char (key, 'FM099999')||'-'||to_char (created, 'yyyymmdd')) virtual 
)
partition by list (partkey) automatic (partition pdefault values ('000000-19000101'))
;

insert into parttab (id, key, created) 
    select rownum id, trunc (rownum/5)+1 key, date'2019-01-01' + trunc (rownum/4)
    from xmlTable ('1 to 6')
; 

select partition_name, high_value, num_rows
from user_tab_partitions
where table_name = upper ('parttab') 
;

Вновь созданные разделы выглядят примерно так:

PARTITION_NAME   HIGH_VALUE           NUM_ROWS
---------------- ------------------ ----------
PDEFAULT         '000000-19000101'           0
SYS_P1588        '000001-20190101'           3
SYS_P1589        '000001-20190102'           1
SYS_P1590        '000002-20190102'           2
2 голосов
/ 16 мая 2019

Проблема :

Интервальное разбиение не поддерживается на уровне подразделов.

То же самое относится к автоматическому разбиению списка - это также не поддерживается. Таким образом, вы не можете решить эту проблему с помощью интервального автоматического разбиения. Поэтому, что бы вы ни делали, вам нужно будет выполнить обслуживание подразделов, чтобы разделить значения.

Если ваша цель - минимизировать (под) обслуживание разделов, вам может быть лучше использовать секционированную таблицу с интервальным списком. С разделом по умолчанию для значений списка.

Вы можете изменить шаблон подраздела в любое время. Это определяет, какие подразделы база данных создает при добавлении нового раздела верхнего уровня.

Например, это создает таблицу интервального списка:

create table partitionedtable ( 
  id              number,
  partitionkey    number,
  created         date
) 
partition by range (created) interval (numtodsinterval(1,'day'))
subpartition by list (partitionkey) 
subpartition template  (
  subpartition p1 values ( 1 ),
  subpartition pdef values ( default )
) ( 
  partition p2000 values less than ( date'2019-01-01' )
);

insert into partitionedtable values ( 1, 1, date'2019-01-02' );
insert into partitionedtable values ( 1, 2, date'2019-01-02' );

Значение 2 помещается в подраздел по умолчанию.

Вы обнаружите это и обновите шаблон, добавив в него подраздел:

alter table partitionedtable
  set subpartition template (
    subpartition p1 values ( 1 ),
    subpartition p2 values ( 2 ),
    subpartition pdef values ( default )  
  );

insert into partitionedtable values ( 1, 1, date'2019-01-03' );
insert into partitionedtable values ( 1, 2, date'2019-01-03' );

select partition_name, subpartition_name, high_value 
from   user_tab_subpartitions;

PARTITION_NAME    SUBPARTITION_NAME    HIGH_VALUE   
P2000             P2000_P1             1             
P2000             P2000_PDEF           default       
SYS_P772          SYS_SUBP771          default       
SYS_P772          SYS_SUBP770          1             
SYS_P776          SYS_SUBP773          1             
SYS_P776          SYS_SUBP774          2             
SYS_P776          SYS_SUBP775          default   

Новый раздел (SYS_P776) имеет подраздел со значением 2. Существующие разделы не изменены. Вам нужно разделить SYS_P772, если вы хотите, чтобы строки со значением 2 в их собственном подразделе были здесь.

Предполагая, что созданная => дата вставки означает, что вам нужно только разделить подразделы для новых ключей разделов между их первой вставкой и датой изменения шаблона.

Принимая во внимание, что с автоматическими диапазонами разделов для каждого нового ключа раздела вам нужно управлять новыми подразделами даты.

Однако, если перевернуть схему разбиения, есть и другие последствия. Поэтому проверьте, подходит ли это другим причинам для разделения (производительность запросов, архивация данных и т. Д.), Прежде чем идти дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...