【问题标题】:Indexing a ranged partition Oracle索引范围分区 Oracle
【发布时间】:2019-03-01 14:11:41
【问题描述】:

我想为我的表的一个分区建立索引,但我不知道该怎么做,而且我无权访问我的数据库 atm。

数据库是 Oracle 11。 我的代码可以工作吗?

CREATE TABLE MARKET.PARTTABLE
(
  EXTRACT_DATE   DATE                   NOT NULL,
  LOAD_ID    NUMBER(10)                 NOT NULL,
  LOAD_DATE  DATE                       NOT NULL,
  NAME  VARCHAR2(200 BYTE)              NOT NULL
)
PARTITION BY RANGE (EXTRACT_DATE)
(   
    PARTITION PDEFAULT VALUES LESS THAN (MAXVALUE)
    NOLOGGING
    NOCOMPRESS 
    TABLESPACE MARKET_DAT
    PCTFREE    0
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                MAXSIZE          UNLIMITED
                BUFFER_POOL      DEFAULT
                FLASH_CACHE      DEFAULT
                CELL_FLASH_CACHE DEFAULT
               )
CREATE INDEX NAME_PARTTABLE ON PARTTABLE(NAME)
)
NOCACHE
NOPARALLEL
MONITORING;

当我运行它时,我收到以下错误:

ORA-14020: 不能为表指定此物理属性 分区

这表明我有格式问题,但实际上我没有找到任何有用的文档来索引分区(或者我可能只是太愚蠢而无法理解它们)。

编辑: 我试过这个:

CREATE TABLE MARKET.PARTTABLE
(
  EXTRACT_DATE   DATE                   NOT NULL,
  LOAD_ID    NUMBER(10)                 NOT NULL,
  LOAD_DATE  DATE                       NOT NULL,
  NAME  VARCHAR2(200 BYTE)              NOT NULL
)
PARTITION BY RANGE (EXTRACT_DATE)
(   
    PARTITION PDEFAULT VALUES LESS THAN (MAXVALUE)
    NOLOGGING
    NOCOMPRESS 
    TABLESPACE MARKET_DAT
    PCTFREE    0
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                MAXSIZE          UNLIMITED
                BUFFER_POOL      DEFAULT
                FLASH_CACHE      DEFAULT
                CELL_FLASH_CACHE DEFAULT
               )
)
NOCACHE
NOPARALLEL
MONITORING;
CREATE INDEX NAME_PARTTABLE ON PARTTABLE(NAME)

它有效,但我不确定索引现在是在分区上还是在整个表上。有人可以帮帮我吗?

【问题讨论】:

  • 您真的要请人测试您的代码吗?如果是这样的话,我可以给你一个现行利率。
  • 嗯,我现在不在工作,所以我无法访问数据库,但我的同事让我帮忙。我会对创建分区索引的正确语法感到满意。
  • 谢谢,这确实有帮助。但是我收到错误 ORA-14020: this physical attribute may not be specified for a table partition 这对我没有多大帮助,我会测试更多..谢谢
  • 我测试了一个不同的解决方案,它不会引发错误,但我不知道我现在是否只是对表进行了索引,或者我是否真的对分区进行了索引。你能帮我一些吗?很抱歉没有提前测试

标签: oracle oracle11g database-partitioning


【解决方案1】:

您的第二个语句实际上并未在分区上创建INDEX。 分区索引应定义为LOCALGLOBAL

由于您要创建的是一个无前缀索引(索引的最左边的列不是分区键),更好的选择是使用LOCAL INDEX

CREATE INDEX NAME_PARTTABLE ON PARTTABLE(NAME) LOCAL;

..但我不确定索引现在是否在分区上,或者是否 它在整张桌子上。

您可以查询数据字典视图ALL_PART_INDEXESUSER_PART_INDEXES 以检查您的索引名称。这些视图不显示正常的非分区索引。

select * from USER_PART_INDEXES where index_name='NAME_PARTTABLE';

Partitioned Tables And Indexes

【讨论】:

  • 谢谢你,我让它按照你描述的那样工作,但没有看到你的答案。我接受了正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多