首页 > 解决方案 > 从区间分区中选择最新的分区

问题描述

我有一个有间隔分区的表。

    CREATE TABLE interval_tab (
  id           NUMBER,
  code         VARCHAR2(10),
  description  VARCHAR2(50),
  created_date DATE
)
PARTITION BY RANGE (created_date)
INTERVAL (NUMTODSINTERVAL(1, 'day'))
(
   PARTITION part_01 values LESS THAN (TO_DATE('01-NOV-2017','DD-MON-YYYY'))
);

数据每天都在新分区中加载到该表中,我需要从最新分区中选择数据。如何查询以获取最新分区中的数据?

谢谢!

标签: sqloraclepartitioning

解决方案


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'));

推荐阅读