Oracle должен иметь возможность определять используемый раздел на основе предиката вашего запроса. Если вы выбрали данные только за текущий день, Oracle должен сделать что-то вроде этого:
create table test_data (
id NUMBER,
code VARCHAR2(10),
description VARCHAR2(50),
created_date DATE default sysdate not null
)
PARTITION BY RANGE (created_date)
INTERVAL(NUMTODSINTERVAL(1, 'day'))
(
PARTITION part_01 values LESS THAN (TO_DATE('20180627','YYYYMMDD'))
);
insert into test_data values (1,'A','A code',sysdate-3);
insert into test_data values (1,'B','B code',sysdate-2);
insert into test_data values (1,'C','C code',sysdate-1);
insert into test_data values (1,'D','D code',sysdate);
insert into test_data values (1,'E','E code',sysdate);
commit;
select * from test_data
where created_date >= trunc(sysdate);
Выход:
ID CODE DESCRIPTION CREATED_DATE
1 D D code 6/27/2018 9:11:07 AM
1 E E code 6/27/2018 9:11:07 AM
Объясните план выглядит так:
Plan
SELECT STATEMENT ALL_ROWS
Cost: 4 Bytes: 168 Cardinality: 3
2 PARTITION RANGE ITERATOR
Cost: 4 Bytes: 168 Cardinality: 3 Partition #: 1 Partitions determined by Key Values
1 TABLE ACCESS FULL TABLE TEST_DATA
Cost: 4 Bytes: 168 Cardinality: 3 Partition #: 1 Partitions determined by Key Values
Вы также можете добавить индексы (локальные или глобальные) в зависимости от вашей ситуации и потребностей.
Примечание : Вы также можете использовать предложение «partition for» для выбора данных из раздела, не зная его имени (особенно полезно при интервальном разбиении). Например:
select * from test_data partition for (to_date('20180627','YYYYMMDD'));