Oracle按程序划分的{LIST}分区和按日期划分的{RANGE}子分区(具有间隔)

时间:2019-10-28 01:20:56

标签: oracle plsql oracle12c partitioning database-partitioning

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

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

每年大约提交的帐单数量如下:
计划_1〜每年3M
计划_2〜每年1百万
每年Program_3〜50万
每年Program_4〜100K

我最初的想法是创建“按列表划分”(程序)和“按范围划分”(BILL_SUBMISSION_DATE)。

我想将oracle interval功能用于SUBPARTITION,想知道这种方法是否有任何限制。

1 个答案:

答案 0 :(得分:0)

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的提醒。在更仔细地研究这个问题时,似乎不需要在PROGRAM上进行分区,因此在BILL_SUBMISSION_DATE上使用INTERVAL子句对范围进行单个分区应该可以正常工作。

当您像PROGRAM这样拥有少量值时,没有明显的理由对其进行分区。 Oracle文档中给出的按列表分区的典型示例是全球呼叫中心的区域列表,这样您就可以在营业时间后对某些区域进行批处理报告和维护,等等。您可以在其上具有全局位图索引PROGRAM,如果您执行的更新不多,则查询条件经常仅包含一个PROGRAM。 (使用位映射索引更新列将短暂锁定表。)