У меня есть эта таблица, как мои основных таблиц (100M строки):Обмен/перемещение разделов между таблицами
create table prova_log(
id_dispositive number,
type number,
date_verification date,
status number
)
partition by range (date_verification) interval (NUMTODSINTERVAL(3,'DAY'))
subpartition by list (type)
subpartition TEMPLATE (
SUBPARTITION type1 VALUES (1),
SUBPARTITION type2 VALUES (2),
SUBPARTITION type3 VALUES (3),
SUBPARTITION type4 VALUES (4)
)
(
partition p0816 values less than (to_date('01/09/2016','dd/mm/yyyy'))
);
И я хочу, чтобы сделать какое-то подпорки со старыми значениями, так что я создал это (0 строки):
create table prova_log_old (
id_dispositive number,
type number,
date_verification date,
status number
)
partition by range (date_verification) interval (NUMTODSINTERVAL(3,'DAY'))
subpartition by list (type)
subpartition TEMPLATE (
SUBPARTITION type1 VALUES (1),
SUBPARTITION type2 VALUES (2),
SUBPARTITION type3 VALUES (3),
SUBPARTITION type4 VALUES (4)
)
(
partition p_old values less than (to_date('01/09/2016','dd/mm/yyyy'))
);
Так что я хочу, чтобы переместить/копировать/обмен (независимо от срока) старые перегородки (15 дней +) для prova_log_old.
Для этого я создал эту работу:
PROCEDURE move_data_from_huge_table
IS
-- This will move all data after 'vcountdaystokeepdata' days
vcountdaystokeepdata NUMBER := 15;
vcountdatainsidepartition NUMBER := 0;
BEGIN
FOR item IN
(SELECT *
FROM (SELECT partition_name,
TO_DATE
(TRIM
('''' FROM REGEXP_SUBSTR
(EXTRACTVALUE
(DBMS_XMLGEN.getxmltype
( 'select high_value from all_tab_partitions where table_name='''
|| table_name
|| ''' and table_owner = '''
|| table_owner
|| ''' and partition_name = '''
|| partition_name
|| ''''
),
'//text()'
),
'''.*?'''
)
),
'syyyy-mm-dd hh24:mi:ss'
) high_value
FROM all_tab_partitions
WHERE table_name = 'PROVA_LOG')
WHERE high_value < SYSDATE - vcountdaystokeepdata)
LOOP
EXECUTE IMMEDIATE 'alter table PROVA_LOG EXCHANGE PARTITION '
|| item.partition_name
|| ' with table PROVA_LOG_OLD';
EXECUTE IMMEDIATE 'select count(*) from PROVA_LOG partition ('
|| item.partition_name
|| ')'
INTO vcountdatainsidepartition;
IF vcountdatainsidepartition = 0
THEN
EXECUTE IMMEDIATE 'ALTER TABLE PROVA_LOG DROP PARTITION '
|| item.partition_name
|| '';
END IF;
END LOOP;
END;
Но когда я запускаю процедуру я получил
ORA-14292 типа разбиения таблицы должен соответствовать типу subpartitioning составного раздела
Я предполагаю, что у меня должен быть раздел в моей таблице резервного копирования с тем же именем, что и моя основная секционированная таблица?
Как это сделать?
Я попытался сделать add
раздел моей резервной таблицы, но безуспешно. Важно отметить, что все имена разделов являются случайными (оракул генерирует его).
Почему вы хотите скопировать данные/переместить в другую таблицу? Это одно из основных преимуществ многораздельной таблицы, в которой вам не нужны такие материалы. –
@WernfriedDomscheit, потому что у меня есть другая работа, чтобы посчитать эти миллионы строк по диапазону дат. даже секционированный процесс занимает слишком много времени, когда таблица похожа на строки 500M + ... В любом случае ... Я хочу «отбросить» (без потери) более старый valeus, так как они мне больше не нужны. –