在Postgresql中创建分区表

时间:2018-06-23 19:50:19

标签: postgresql database-partitioning postgresql-10

我正在尝试查找创建分区表的示例。 我有一些带有许多元组的表,我可以根据一个列的值对它们进行分类,但是,我只是找到使用范围和日期的示例(我的列是varchar,而在其他表中是int /外键)。 我正在尝试使用这种技术来加快SELECT的速度。

这里是我的CREATE表之一(列Source将用于对该表进行分区):

CREATE TABLE tb_hit_source (
Hit_SourceId bigserial NOT NULL,
Source varchar(50) NOT NULL,
UniqueId varchar(50) NOT NULL,
tb_hit_HitId int8 NOT NULL,
CONSTRAINT tb_hit_source_ak_1 UNIQUE (Source, tb_hit_HitId, UniqueId) NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT tb_hit_source_pk PRIMARY KEY (Hit_SourceId)
);
CREATE INDEX tb_hit_source_idx_1 on tb_hit_source (Source ASC);
CREATE INDEX tb_hit_source_idx_2 on tb_hit_source (tb_hit_HitId ASC);
ALTER TABLE tb_hit_source ALTER COLUMN Hit_SourceId SET DEFAULT nextval('"HitSourceId_seq_tb_hit_source"');;

2 个答案:

答案 0 :(得分:1)

创建表。

CREATE TABLE tb_hit_source (
Hit_SourceId bigserial NOT NULL,
Source varchar(50) NOT NULL,
UniqueId varchar(50) NOT NULL,
tb_hit_HitId int8 NOT NULL,
CONSTRAINT tb_hit_source_ak_1 
    UNIQUE (Source, tb_hit_HitId, UniqueId) NOT DEFERRABLE,
CONSTRAINT tb_hit_source_pk PRIMARY KEY (Hit_SourceId)
PARTITION BY RANGE (Source);

然后创建分区,在范围的两端使用相同的值来强制使用单个值分区。

CREATE TABLE tb_hit_source_a PARTITION OF tb_hit_source
    FOR VALUES FROM ('a') TO ('a');

podtgresql 11提供了PARTITION BY LIST (source),可以更简单地声明分区。

CREATE TABLE tb_hit_source_a PARTITION OF tb_hit_source
    FOR VALUES IN ('a');

答案 1 :(得分:0)

创建分区

create table part_a (check source='part_a' )inherits (tb_hit_source);
create table part_a (check source='part_b' )inherits (tb_hit_source);

但是如果要有很多分区,将它们放在单独的模式中可能会更方便。

create schema hit_source_parts;
create table hit_source_parts.a (check(source='a'))inherits (tb_hit_source);
create table hit_source_parts.b (check(source='b'))inherits (tb_hit_source);

您创建的任何分区也将需要适当的索引。

唯一约束不会在分区上起作用,这就是为什么大多数使用唯一的列之一对分区进行分区的原因,通过这种方式将每个分区中的唯一性碎片化,还可以强制实现全局唯一性。