分区表上主键的分区索引

问题描述 投票:0回答:2

我想创建分区表:

            create table audit
            (
                id             number(38,0) not null enable,
                audit_time     timestamp(6),
                description    varchar2(100 byte),
                constraint pk_audit primary key (id)
            )
            partition by range (audit_time)
                interval(numtoyminterval(1, 'month'))
            (
                partition low_p values less than (timestamp' 2010-01-01 00:00:00')
            );

            create index audit_idx on audit(audit_time) local;

大约会有3亿行。 我找不到关于分区表 PK 分区的明确答案。

我的问题是:

  1. 我应该为主键创建分区索引吗?
  2. 必须是全局分区还是本地分区?
  3. 一定是哈希分区吗?
  4. 如何知道该索引必须有多少个分区?

应该是这样的:

CREATE INDEX audit_unq
ON audit(id)
GLOBAL PARTITION BY HASH (id)
( PARTITION p1
, PARTITION p2
, PARTITION p3
, PARTITION p4
);

或不?)

分区表 pk 的最佳实践是什么?

oracle partitioning
2个回答
0
投票

您可以创建 UNIQUE(或 PRIMARY KEY)索引

LOCAL
但是,分区键必须是索引的一部分,即您需要创建复合主键:

create table audit
(
    id             number(38,0) not null enable,
    audit_time     timestamp(6),
    description    varchar2(100 byte)
)
partition by range (audit_time)
    interval(numtoyminterval(1, 'month'))
(
    partition low_p values less than (timestamp' 2010-01-01 00:00:00')
);

ALTER TABLE audit ADD (CONSTRAINT audit_PK PRIMARY KEY (id, audit_time) USING INDEX LOCAL);

除非包含分区键列,否则不可能使用 UNIQUE LOCAL 索引。

类似的索引

CREATE INDEX audit_unq ON audit(id) GLOBAL PARTITION BY HASH (id) ( PARTITION p1, ...);

是可能的。但是,索引分区与表分区不同。我没有看到这个索引有任何目的。您不会通过分区修剪获得任何性能,并且当您删除/截断分区时,您必须重建索引

audit_unq
。所以你没有得到任何好处,实际上它结合了global
local
索引的缺点


0
投票

对于具有数十亿行的表上的 PK 列,我们始终使用全局哈希分区索引。这支持并发写入访问,从而避免阻塞情况。 B 树的深度也可以减少。 一个有趣的问题是,如果可以避免大量冗余,那么非 pk 列上的全局哈希分区索引是否应该优先于本地索引。 比如说,每个本地索引都包含与另一个表相同的外键值。 因此,在极端情况下,我猜这可能会导致索引大小为 #global index size * #table partitions。

© www.soinside.com 2019 - 2024. All rights reserved.