在间隔分区创建查询中替代 VALUES LESS THAN

Alternative to VALUES LESS THAN in interval partitioing creation query

我们知道间隔分区是范围分区的扩展,它的大部分语法来自 范围分区。

从网络上的各种来源,我假设间隔分区创建查询确实具有强制性的以下子句: 值小于 (XXX)

但是当我们进行间隔分区时,有没有更简单的方法,我们不提供任何 VALUE LESS THAN CLAUSE。 我正在搜索类似于 EQUAL TO (012019) 的内容,其中 012019 对应于一月份的间隔 2019年。

我浏览了 help/understanding 的以下链接,但找不到对我的问题有用的链接。

http://www.dba-oracle.com/t_interval_partitioning.htm

https://docs.oracle.com/database/121/VLDBG/GUID-C121EA1B-2725-4464-B2C9-EEDE0C3C95AB.htm

我使用的代码如下:


create table 
pos_data ( 
   start_date        DATE,
   store_id          NUMBER,
   inventory_id      NUMBER(6),
   qty_sold          NUMBER(3)
) 
PARTITION BY RANGE (start_date) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
(  
   PARTITION pos_data_p2 VALUES LESS THAN (TO_DATE('1-7-2007', 'DD-MM-YYYY')),
   PARTITION pos_data_p3 VALUES LESS THAN (TO_DATE('1-8-2007', 'DD-MM-YYYY')) 
);

从我的搜索看来,除了 VALUE LESS THAN 之外别无他法。

如果有人对创建基于间隔的分区的其他方法有所了解,请分享。

其余:我的问题在上面的粗体部分

我想你要找的是 partition extended name

PARTITION FOR(DATE'2019-01-01')

其实LESS THAN定义在区间划分接近于零的作用

在创建 table 以 定义数据的一些下限时只使用一次

这里是定义一个 table 包含从 2019 年开始的数据的示例

create table pos_data ( 
   start_date        DATE,
   store_id          NUMBER
)
SEGMENT CREATION DEFERRED
PARTITION BY RANGE (start_date) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
(  
   PARTITION pos_data_init VALUES LESS THAN (TO_DATE('1-1-2019', 'DD-MM-YYYY')) 
);

请注意,第一个分区不是间隔分区 (INTERVAL = NO),并且由于 SEGMENT CREATION DEFERRED 而在物理上不存在。它也永远不会包含任何数据,因为您从 2019 年的内容开始。

select PARTITION_POSITION,PARTITION_NAME,INTERVAL,MIN_EXTENT, HIGH_VALUE
from user_tab_partitions where table_name = 'POS_DATA'
order by PARTITION_POSITION;

PARTITION_POSITION PARTITION_NAME INTERVAL MIN_EXTENT HIGH_VALUE                     
------------------ -------------- -------- ---------- ------------------------------- 
                 1 POS_DATA_INIT  NO                  TO_DATE(' 2019-01-01 00:00:00',  

新分区被创建即时例如插入新数据时,您不需要指定 LESS THAN

insert into pos_data(start_date,store_id) values(DATE'2019-01-01',1);

PARTITION_POSITION PARTITION_NAME INTERVAL MIN_EXTENT HIGH_VALUE                    
------------------ -------------- -------- ---------- -------------------------------
                 1 POS_DATA_INIT  NO                  TO_DATE(' 2019-01-01 00:00:00',  
                 2 SYS_P16713     YES               1 TO_DATE(' 2019-02-01 00:00:00', 

虽然 访问 table 您使用 partition_extended_name您可以选择一个月内的任何日期来引用分区.

select * from  pos_data
partition for (date'2019-01-15');

相同的语法可用于分区维护

alter table pos_data move partition for (date'2019-01-30') compress;