【问题标题】:Extending existing partitioning扩展现有分区
【发布时间】:2015-12-02 23:50:02
【问题描述】:

在表格的简化结构下:

create table customer(
incident_id number,
customer_id number,
customer_name varchar2(400),
sla_id number
failure_start_date date,
failure_end_date date, 
churn_flag number, -- 0 or 1 
active number,  -- 0 or 1
constraint pk_incident_id primary key (incident_id))
PARTITION BY LIST (active)
SUBPARTITION BY LIST (churn_flag)
SUBPARTITION  TEMPLATE  
  ( SUBPARTITION sp_churn_flag_1 VALUES (1)
  , SUBPARTITION sp_churn_flag_0 VALUES (0)
  )

  (PARTITION sp_active_1 values (1)
  , PARTITION sp_active_0 VALUES (0)
  )
,
ENABLE ROW MOVEMENT COMPRESS FOR QUERY LOW;

现在我需要在现有的 Composite-List-Partition 中添加一个 Interval-Range-Partitioning,以便按月(failure_starte_date - YYYYMM)对数据进行分区。该表包含从 200701 到现在 (201511) 的数据。 failure_start_date

【问题讨论】:

  • 您是说,您希望每个churn_flag 子分区每个月包含多个子分区吗?如果有,有什么用?
  • 是的,这就是我想要归档的内容。做什么的?我有很多可以通过这种方式合理划分的数据。它将提高查询此表的报告工具的性能。
  • 因此,您有很多查询,其中指定了activechurn_flagfailure_start_date的间隔返回的数据太多以至于您需要扫描分区而不是通过索引访问数据?
  • 没错。你知道我需要如何对现有分区进行分区吗?

标签: oracle database-partitioning


【解决方案1】:

你不能完全按照你想要的方式去做。分区策略在两个相关方面受到限制:第一,复合策略只能有两个级别(您需要 3 个),第二,区间分区,在复合策略中使用时必须在顶层。

这是最接近你想要的合法的东西:

CREATE TABLE matt_customer
(
  incident_id          NUMBER,
  customer_id          NUMBER,
  customer_name        VARCHAR2 (400),
  sla_id               NUMBER,
  failure_start_date   DATE,
  failure_end_date     DATE,
  churn_flag           VARCHAR2 (1),                                                                           -- 0 or 1
  active               VARCHAR2 (1),                                                                           -- 0 or 1
  active_churn_flags   VARCHAR2 (2) GENERATED ALWAYS AS (active || churn_flag) VIRTUAL,
  CONSTRAINT pk_incident_id PRIMARY KEY (incident_id)
)
PARTITION BY RANGE
  (failure_start_date)
  INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
  SUBPARTITION BY LIST
    (active_churn_flags)
    SUBPARTITION TEMPLATE (
      SUBPARTITION sp_ac_00 VALUES ('00'),
      SUBPARTITION sp_ac_01 VALUES ('01'),
      SUBPARTITION sp_ac_10 VALUES ('10'),
      SUBPARTITION sp_ac_11 VALUES ('11'))
  (PARTITION customer_old VALUES LESS THAN (TO_DATE ('01-JAN-2013', 'DD-MON-YYYY')))
ENABLE ROW MOVEMENT
--COMPRESS FOR QUERY LOW;
;

这使用间隔列表分区,并使用虚拟列将您的 activechurn_flag 列合并为一个(为简单起见,我将这些列转换为 VARCHAR2(1)

要使用分区修剪,您的查询需要修改为选择 active_churn_flags = '01',而不是单独指定 activechurn_flag 的值。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多