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
级别的间隔。这是否意味着我们必须手动创建partitions
和subpartitions
?
哦,是的;忘记了....再想一想,PROGRAM
列可能并不是真正需要分区的,因此您可以使用INTERVAL
子句在BILL_SUBMISSION_DATE
上进行分区,并且不需要子分区.我会在业余时间尝试更多的推理来更新我的答案。以上是关于Oracle LIST 分区按程序和 RANGE 子分区按 DATE 间隔的主要内容,如果未能解决你的问题,请参考以下文章
oracle interval-partition 解决range分区大难题