oracle - 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 间隔功能,想知道这种方法是否有任何限制。
解决方案
您的分区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_DATE
INTERVAL
当您拥有像 for 那样的一小组值时PROGRAM
,没有明显的理由对其进行分区。Oracle文档中给出的列表分区的典型示例是区域列表,用于全球呼叫中心,以便您可以在下班后对某些区域进行批量报告和维护等。您可以在上建立全局位图索引PROGRAM
,如果你不做很多更新,如果你经常查询条件只包括一个PROGRAM
. (使用位映射索引更新列将暂时锁定表。)
推荐阅读
- javascript - React 本机状态未使用 animated.start() 中的钩子更新
- hyperledger-fabric - 在超级账本结构中使用 Solidity 智能合约
- sql - 如何从另一个表插入更新数据?
- java - Spring MVC:通过 REST 端点将字符串日期转换为日期
- android - 未解决参考
- r - geom_text 删除其他几何图形(geom_point 和 geom_line)
- linux - 无法从 uniprot 获取 wget,ssv3 错误是什么意思?
- sql - 在 utl_file.fopen 的 'filename' 属性中使用 select
- java - Java为每个输出输出不同的行号
- sql - 用于添加字段或带有公式的字段的 SQL 命令