Динамическое разбиение таблиц в Oracle - PullRequest
9 голосов
/ 03 февраля 2010

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

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

Ответы [ 4 ]

10 голосов
/ 03 февраля 2010

В 11g мы можем определить разделы INTERVAL, и Oracle автоматически создаст новые разделы, когда получит новые записи, ключи которых не вписываются ни в один из существующих диапазонов. Это очень крутая функция. Узнайте больше .

Следует иметь в виду, что разбиение разделов является платным дополнением к лицензии Enterprise Edition. Так что это не дешево использовать.

3 голосов
/ 03 февраля 2010

вы можете автоматизировать процесс создания или усечения разделов с помощью динамического SQL . Вы бы написали процедуры с помощью EXECUTE IMMEDIATE или DBMS_SQL и запланировали бы их с помощью DBMS_JOB или DBMS_SCHEDULER ( DBMS_SCHEDULER - это функция 10 г, более универсальная, чем DBMS_JOB).

Возможно, вы захотите сначала создать операторы разделов вручную, а потом автоматизировать процесс, когда будете уверены в DDL. Вы найдете все синтакс в документации для оператора ALTER TABLE .

1 голос
/ 08 сентября 2013

Есть продукт, который заботится о нем автоматически. PartitionManager for Oracle обеспечивает автоматическое управление разделами, основанное на сохранении организации, включая очистку и архивирование старых данных, копирование статистики и т. Д.

1 голос
/ 06 января 2011

Вот пример того, что я придумал для создания разделов, используя SYSDATE и смещение.Мне пришлось создать параметры замены со строкой, соединенной с SYSDATE:

COLUMN temp_var new_value partition_name_01;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 3, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_01;
SELECT TO_CHAR(SYSDATE - 3, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_02;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 2, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_02;
SELECT TO_CHAR(SYSDATE - 2, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_03;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 1, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_03;
SELECT TO_CHAR(SYSDATE - 1, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_04;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_04;
SELECT TO_CHAR(SYSDATE, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
CREATE TABLE TABLE_NAME
(
   SEQ_NO                 NUMBER NOT NULL,
   INSERT_DATE            DATE NOT NULL,
   FIRST_NAME             VARCHAR2 (256 BYTE),
   LAST_NAME              VARCHAR2 (256 BYTE),
   ID_NUM                 NUMBER,
   ID_STATUS              NUMBER
)

PARTITION BY RANGE
   (INSERT_DATE)
   SUBPARTITION BY LIST
      (ID_STATUS)
      SUBPARTITION TEMPLATE (
         SUBPARTITION SP1 VALUES (0) TABLESPACE &tblspce,
         SUBPARTITION SP2 VALUES (1) TABLESPACE &tblspce,
         SUBPARTITION SP3 VALUES (2) TABLESPACE &tblspce)

   (
   PARTITION &partition_name_01
      VALUES LESS THAN
      (TO_DATE ('&partition_date_01',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')),

   PARTITION &partition_name_02
      VALUES LESS THAN
      (TO_DATE ('&partition_date_02',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')),

   PARTITION &partition_name_03
      VALUES LESS THAN
      (TO_DATE ('&partition_date_03',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')),
sysdate

   PARTITION &partition_name_04
      VALUES LESS THAN
      (TO_DATE ('&partition_date_04',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')))

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