Oracle LIST 分区按程序和 RANGE 子分区按 DATE 间隔

Posted

技术标签:

【中文标题】Oracle LIST 分区按程序和 RANGE 子分区按 DATE 间隔【英文标题】:Oracle LIST Partition by Program and RANGE subpartition by DATE with intervalOracle LIST 分区按程序和 RANGE 子分区按 DATE 间隔 【发布时间】:2019-10-28 01:20:56 【问题描述】:

我正在尝试找出确定 Oracle 12c (12.2.0.1.0) 中分区策略的最佳方法 这个post 几乎和我的要求一样。但是,我想知道在 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 间隔功能,想知道这种方法是否有任何限制。

【问题讨论】:

【参考方案1】:

您使用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。 (使用位图索引更新列将暂时锁定表。)

【讨论】:

谢谢马克。看起来 Oracle 不允许 subpartition 级别的间隔。这是否意味着我们必须手动创建partitionssubpartitions 哦,是的;忘记了....再想一想,PROGRAM 列可能并不是真正需要分区的,因此您可以使用INTERVAL 子句在BILL_SUBMISSION_DATE 上进行分区,并且不需要子分区.我会在业余时间尝试更多的推理来更新我的答案。

以上是关于Oracle LIST 分区按程序和 RANGE 子分区按 DATE 间隔的主要内容,如果未能解决你的问题,请参考以下文章

Oracle分区表

oracle interval-partition 解决range分区大难题

Oracle 表分区介绍与使用

oracle组合分区

mysql里的range分区方式和主键冲突了怎么办?innodb中没有主键会造成啥影响?

Oracle分区表