我们必须将快照数据从源(SQL Server)提取到目标(Oracle) . 源中的数据大多每天都附加,尽管删除和更新很少 . 由于数据在源中更新和删除,因此很难知道我们在过去的特定日期拥有哪些数据,除非我们通过使用新字段“as_of_dt”将每日快照数据拉入目标 . 考虑到目标表之上的报告要求,最好按月分区和按日分区 .

我可以创建如下表格 -

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只做 single subpartition scan -

WHERE AS_OF_DT = TO_DATE('2017-06-15', 'yyyy-mm-dd')
AND AS_OF_DAY = 15;

如何使用相同的日期字段按日期和子分区进行分区(在本例中为“as_of_dt”),这样我就不必为Oracle添加额外的过滤器来仅扫描属于该日期的子分区?

如果你想知道我为什么不在日期上进行分区而不是在月份上进行分区,然后在日期进行分区,原因是会有太多的主分区(365 /年),我认为这不是个好主意 .