我想创建分区表:
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 分区的明确答案。
我的问题是:
应该是这样的:
CREATE INDEX audit_unq
ON audit(id)
GLOBAL PARTITION BY HASH (id)
( PARTITION p1
, PARTITION p2
, PARTITION p3
, PARTITION p4
);
或不?)
分区表 pk 的最佳实践是什么?
您可以创建 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
索引的缺点。
对于具有数十亿行的表上的 PK 列,我们始终使用全局哈希分区索引。这支持并发写入访问,从而避免阻塞情况。 B 树的深度也可以减少。 一个有趣的问题是,如果可以避免大量冗余,那么非 pk 列上的全局哈希分区索引是否应该优先于本地索引。 比如说,每个本地索引都包含与另一个表相同的外键值。 因此,在极端情况下,我猜这可能会导致索引大小为 #global index size * #table partitions。