我正在尝试确定在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,想知道这种方法是否有任何限制。
答案 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
。 (使用位映射索引更新列将短暂锁定表。)