首页 > 解决方案 > Oracle {LIST} 分区按程序和 {RANGE} 子分区按 DATE 间隔

问题描述

我试图找出在 Oracle 12c (12.2.0.1.0) 中确定分区策略的最佳方法。这篇文章 几乎与我的要求相同。但是,我想知道在 Oracle 12c (12.2.0.1.0) 版本中实现的最佳方法。

这是我的问题:我们的系统中有四 (4) 个不同的项目,它们的账单已提交。

每年提交的账单大约数量如下:
Program_1 ~ 3M 每年
Program_2 ~ 1M 每年
Program_3 ~ 500K 每年
Program_4 ~ 100K 每年

我最初的想法是创建 PARTITION BY LIST (PROGRAM) 和 SUBPARTITION BY RANGE (BILL_SUBMISSION_DATE)。

我想对 SUBPARTITION 使用 oracle 间隔功能,想知道这种方法是否有任何限制。

标签: oracleplsqloracle12cpartitioningdatabase-partitioning

解决方案


您的分区PROGRAM和子分区方法BILL_SUBMISSTION_DATE听起来不错。

我没有测试性能差异(我想它们可以忽略不计),但INTERVAL在我看来,对于编码选项,查询和维护更容易。

对于以下示例,我使用的表分区子句是:

partition by range (INVOICE_MONTH) interval (numtoyminterval(1, 'MONTH'))

示例查询,使用旧式分区名称,查询 2012 年 4 月发票的分区,假设我为该INV201204月的这些发票创建了一个分区:

select * from MARK_INV_HDR
    partition ('INV201204');

同样的查询,使用INTERVAL自动生成的分区:

select * from MARK_INV_HDR 
    where invoice_month = to_date('2012-04', 'yyyy-mm');

稍后查询的优点是我不必知道分区的命名约定。

要删除最旧的分区,一个查询和一个 DDL:

select to_char(min(invoice_month), 'dd-Mon-yyyy') as min_inv_dt from MARK_INV_HDR;

MIN_INV_DT
-----------
01-Apr-2012

alter table mark_inv_hdr 
    drop partition for (TO_DATE('01-Apr-2012', 'dd-Mon-yyyy'))
    update global indexes;

编辑:

更新:我忘记了您不能INTERVAL在子分区上使用该子句;感谢 user12283435 的提醒。在更仔细地研究这个问题时,似乎可能不需要对 on 进行分区,因此只需使用子句PROGRAM按范围进行单个分区就可以正常工作。BILL_SUBMISSION_DATEINTERVAL

当您拥有像 for 那样的一小组值时PROGRAM,没有明显的理由对其进行分区。Oracle文档中给出的列表分区的典型示例是区域列表,用于全球呼叫中心,以便您可以在下班后对某些区域进行批量报告和维护等。您可以在上建立全局位图索引PROGRAM,如果你不做很多更新,如果你经常查询条件只包括一个PROGRAM. (使用位映射索引更新列将暂时锁定表。)


推荐阅读