我正在尝试查找创建分区表的示例。 我有一些带有许多元组的表,我可以根据一个列的值对它们进行分类,但是,我只是找到使用范围和日期的示例(我的列是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"');;
答案 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);
等
您创建的任何分区也将需要适当的索引。
唯一约束不会在分区上起作用,这就是为什么大多数使用唯一的列之一对分区进行分区的原因,通过这种方式将每个分区中的唯一性碎片化,还可以强制实现全局唯一性。