复合间隔分区-按月份划分的第一个分区和按日期划分的子分区-Oracle 11g R2
我们必须将快照数据从源(SQL Server)拉到目标(Oracle)。源中的数据大部分是每天追加的,尽管可能很少有删除和更新。由于数据在源中被更新和删除,因此很难知道我们在过去某个特定日期拥有哪些数据,除非我们通过使用新字段“as_of_dt”将日常快照数据拉入目标中。考虑到目标表顶部的报告要求,最好按月份划分,按日期细分 我可以创建如下表-复合间隔分区-按月份划分的第一个分区和按日期划分的子分区-Oracle 11g R2,oracle,plsql,oracle11g,partitioning,database-partitioning,Oracle,Plsql,Oracle11g,Partitioning,Database Partitioning,我们必须将快照数据从源(SQL Server)拉到目标(Oracle)。源中的数据大部分是每天追加的,尽管可能很少有删除和更新。由于数据在源中被更新和删除,因此很难知道我们在过去某个特定日期拥有哪些数据,除非我们通过使用新字段“as_of_dt”将日常快照数据拉入目标中。考虑到目标表顶部的报告要求,最好按月份划分,按日期细分 我可以创建如下表- CREATE TABLE SUBPART_TABLE ( AS_OF_DT DATE, AS_OF_DAY NUMBER(2,0) GENERA
CREATE TABLE SUBPART_TABLE
(
AS_OF_DT DATE,
AS_OF_DAY NUMBER(2,0) GENERATED ALWAYS AS (EXTRACT(DAY FROM AS_OF_DT)) VIRTUAL,
... more COLUMNS
)
partition by range (AS_OF_DT) interval (numtoyminterval(1,'MONTH'))
SUBPARTITION BY LIST (AS_OF_DAY)
SUBPARTITION TEMPLATE
(SUBPARTITION P01 VALUES (1),
SUBPARTITION P02 VALUES (2),
SUBPARTITION P03 VALUES (3),
...
SUBPARTITION P30 VALUES (30)
SUBPARTITION P31 VALUES (31)
)
(
partition P201706 values less than (to_date('2017-07-01','yyyy-mm-dd'))
);
查看解释计划,我认为我必须包括以下两个过滤器,以便Oracle只进行单子分区扫描-
WHERE AS_OF_DT = TO_DATE('2017-06-15', 'yyyy-mm-dd')
AND AS_OF_DAY = 15;
如何使用相同的日期字段(在本例中为“as_of_dt”)按月份进行分区,并按日期进行子分区,这样我就不必为Oracle添加额外的筛选器来只扫描属于该日期的子分区
如果您想知道为什么我不按日期分区,而不是按月份分区,然后按日期子分区,原因是主分区太多(365/年),我认为这不是个好主意 为什么子分区比多个分区更好?通常,子分区与分区相同。在我看来,“分部”这个名字有点误导。这是一个更好的术语。分区和子分区之间的层次依赖关系仅与创建相关,分区和子分区的段是相同的,即,如果查询必须访问分区或子分区,则没有任何区别。Oracle允许1024K-1个分区,即超过一百万个分区。365应该是没有问题的,Ohtherwise 1周怎么样,即
按范围划分(以DT为单位)间隔(numtodsinterval(7,'DAY'))