Создать таблицу разделов в Postgresql - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь найти пример для создания таблицы разделов.У меня есть несколько таблиц с множеством кортежей, и я могу классифицировать их по значению одного столбца, но я просто нахожу примеры с использованием диапазона и даты (мой столбец - это 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 голосов
/ 24 июня 2018

для создания таблицы делаем.

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');
0 голосов
/ 24 июня 2018

для создания разделов выполните

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

и т. Д.

Любые разделы, которые вы создаете, также будут нуждаться в индексах aproptiate.

уникальные ограничения не будут работать между разделами, и это одна из причин, почему большинство использует разделение разделовв одном из уникальных столбцов фрагментация таким образом уникальности в каждом разделе также обеспечивает глобальную уникальность.

...