【问题标题】:Index on subpartition on Oracle DatabaseOracle 数据库中的子分区索引
【发布时间】:2017-06-02 17:23:18
【问题描述】:

我在一个表上创建了一个复合范围列表分区,它遵循以下示例代码。

CREATE TABLE sample_regional_sales
      (deptno number, item_no varchar2(20),
       txn_date date, txn_amount number, state varchar2(2))
  PARTITION BY RANGE (txn_date)
    SUBPARTITION BY LIST (state)
      (PARTITION q1_1999 VALUES LESS THAN (TO_DATE('1-APR-1999','DD-MON-YYYY'))
          TABLESPACE tbs_1
         (SUBPARTITION q1_1999_northwest VALUES ('OR', 'WA'),
          SUBPARTITION q1_others VALUES (DEFAULT) TABLESPACE tbs_4
         ),
       PARTITION q2_1999 VALUES LESS THAN ( TO_DATE('1-JUL-1999','DD-MON-YYYY'))
          TABLESPACE tbs_2
         (SUBPARTITION q2_1999_northwest VALUES ('OR', 'WA'),
          SUBPARTITION q2_1999_southcentral VALUES ('OK', 'TX')
         ),
       PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-OCT-1999','DD-MON-YYYY'))
          TABLESPACE tbs_3
         (SUBPARTITION q3_1999_northwest VALUES ('OR', 'WA'),
          SUBPARTITION q3_others VALUES (DEFAULT) TABLESPACE tbs_4
         ),
       PARTITION q4_1999 VALUES LESS THAN ( TO_DATE('1-JAN-2000','DD-MON-YYYY'))
          TABLESPACE tbs_4
      );

我能够在范围分区上创建索引:

create index SOME_INDEX_NAME on sample_regional_sales (txn_date) global
    PARTITION by range (txn_date)
    (
    PARTITION q1_1999 VALUES LESS THAN (TO_DATE('1-APR-1999','DD-MON-YYYY')),
    PARTITION q2_1999 VALUES LESS THAN (TO_DATE('1-JUL-1999','DD-MON-YYYY')),
    PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-OCT-1999','DD-MON-YYYY')),
    PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-NOV-1999','DD-MON-YYYY'))
    PARTITION year_after VALUES LESS THAN (MAXVALUE)
    );

我找不到的是是否有办法在子分区中添加索引。

目前我在 date 列(我想删除)上有一个索引,但在状态分区上没有。

简而言之,有没有办法在子分区上创建索引?

【问题讨论】:

  • 听起来您需要在 state 列上建立本地索引。这样,索引的分区和子分区将与表的分区和子分区相对应。

标签: sql oracle indexing database-partitioning


【解决方案1】:

我会说创建不同于表分区的索引分区是相当少见的。

通常你创建一个全局索引

create index SOME_INDEX_NAME on sample_regional_sales (txn_date) global;

或者你做本地索引:

create index SOME_INDEX_NAME on sample_regional_sales (txn_date) local;

这样每个表(子)分区都会自动得到一个对应的索引分区。

当您像以前一样创建索引时

create index SOME_INDEX_NAME on sample_regional_sales (txn_date) global
    PARTITION by range (txn_date)
    (
    PARTITION q1_1999 VALUES LESS THAN (TO_DATE('1-APR-1999','DD-MON-YYYY')),
    ...
    );

索引是在子分区中创建的。分区只是一组子分区。

声明“目前我在状态列上有一个索引,但在状态分区上没有。”没有任何意义。您为整个表的列定义索引。该索引可以分为(即分区)几个物理部分。

【讨论】:

  • 更正了“目前我在状态列上有索引,但在状态分区上没有索引”。 .我的意思是我在日期中有一个索引,但在状态上没有。
  • 当您从 txn_date 中删除索引时,您将删除索引 - 期间。你的意图是什么?还是您只想从某些(子)分区中删除它而不是全部?
  • 我的目标是让每个范围分区的 txn_date 被索引,但也让每个列表分区的状态列。也许我走错了方向。我刚刚尝试了您的建议,分别在每列上使用本地索引,但解释计划中的成本与全局索引完全相同。查询的结果也完全相同。
  • 您的查询看起来如何?
  • 同样,当您创建索引时,您总是为 整个 表定义它(为了清楚起见,让我们跳过选项Partial Indexes for Partitioned Tables)。 “分区”只是意味着您将索引(或表)切割成多个物理卡盘 - 它们基本上都是相等的。你不能说“我喜欢在分区或子分区上定义索引”
猜你喜欢
  • 1970-01-01
  • 2013-06-02
  • 2016-11-07
  • 1970-01-01
  • 2019-11-28
  • 2010-09-05
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多