#sql #база_данных #oracle #oracle11g
Есть таблица +20 млн. записей за 2 года. Хочу ее партиционировать по дате, период 1 месяц. Офф. документацию смотрел и возникли вопросы: обязательно ли для паритициорирования пересоздавать таблицу? во всех примерах партиции создаются в ручную, например: PARTITION BY RANGE (time_id)INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) ( PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-2007', 'DD-MM-YYYY')), PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2008', 'DD-MM-YYYY')), PARTITION p2 VALUES LESS THAN (TO_DATE('1-7-2009', 'DD-MM-YYYY')), PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2010', 'DD-MM-YYYY')) ); , можно как-то автоматизировать этот процесс?
Ответы
Ответ 1
обязательно ли для паритиционирования пересоздавать таблицу? Да, существующую не паритиционированную таблицу можно изменить начиная с 12.02. Создайте новую и импортируйте данные: create table ptab (id number, time_id date) partition by range (time_id) interval (numtoyminterval (1,'month')) ( partition partdef values less than (date'2000-01-01') ); партиции создаются вручную ... можно как-то автоматизировать этот процесс? Да, он уже автоматизирован. При создании таблицы надо создать как минимум только одну партицию, например, для заведомо старых дат (см. пример выше). Новые партиции добавятся при вставке автоматически и будут выглядеть где-то так: insert into ptab select rownum, date'2019-01-01'+rownum*30 from xmlTable ('1 to 3') ; exec dbms_stats.gather_table_stats (user, 'ptab') select partition_name, high_value, num_rows from user_tab_partitions where table_name = upper ('ptab') ; PARTITION_NAME HIGH_VALUE NUM_ROWS ---------------- ---------------------------------------------------------- ---------- PARTDEF TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 0 SYS_P2227 TO_DATE(' 2019-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 1 SYS_P2228 TO_DATE(' 2019-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 1 SYS_P2229 TO_DATE(' 2019-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 1
Комментариев нет:
Отправить комментарий