【问题标题】:Create a Partition Table in Postgresql在 Postgresql 中创建分区表
【发布时间】:2018-06-24 16:08:02
【问题描述】:

我正在尝试寻找创建分区表的示例。 我有一些包含许多元组的表,我可以根据一列的值对它们进行分类,但是,我只是找到使用范围和日期的示例(我的列是 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"');;

【问题讨论】:

  • 如何使用 source 对表进行分区?
  • 对表进行分区只会加速顺序扫描。
  • @a_horse_with_no_name 我已经看过手册,但是,在我的问题中,我说我找不到没有范围或日期的示例
  • @Jasen Source,在这个表中,表示从哪里获取这个元组的数据。我有一个有限的来源列表。该表将有 400 万个元组。从每个来源,我有大约 500.000 个元组(除了 1 个具有大约 170 万个元组的来源)。
  • @LaurenzAlbe 我没有如何在分区表中使用索引?

标签: postgresql database-partitioning postgresql-10


【解决方案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');

【讨论】:

  • PostgreSQL 11?你说的是测试版吗?
【解决方案2】:

创建分区做

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);

等等

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

唯一约束不会跨分区起作用,这就是为什么大多数使用在唯一列之一上进行分区的原因之一,通过分割这种方式,每个分区中的唯一性也强制执行全局唯一性。

【讨论】:

  • 问题被标记为postgresql-10,因此声明性分区应该优先于继承
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 2022-01-07
  • 2020-02-27
  • 2012-04-07
  • 1970-01-01
相关资源
最近更新 更多