首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL10 -可以按列表(col1、col2、.、colN)进行分区吗?

问PostgreSQL10 -可以按列表(col1、col2、.、colN)进行分区吗?
EN

Stack Overflow用户
提问于 2020-09-16 09:04:43
回答 1查看 1.3K关注 0票数 2

我正在查看PostgreSQL 关于表分区的正式文档页,以获得我的postgres版本。

我想在三列上创建表分区,并且我希望使用带有BY LIST方法的声明式分区来实现这一点。

但是,我似乎找不到一个很好的例子,说明如何处理更多的列,特别是BY LIST。

在上述文档中,我只读到:

如果需要,可以决定在分区键中使用多列进行范围分区。(...)例如,考虑使用列lastname和range (按该顺序)作为分区键进行分区的表范围。

似乎多列上的声明性分区只适用于BY RANGE,还是不对?

但是,如果不是,我发现了对此的回答,它告诉我如何处理BY LIST和一列。但在我的例子中我有三栏。

我的想法是做以下事情(我很确定这是错误的):

代码语言:javascript
复制
CREATE TABLE my_partitioned_table (
    col1 type CONSTRAINT col1_constraint CHECK (col1 = 1 or col1 = 0),
    col2 type CONSTRAINT col2_constraint CHECK (col2 = 'A' or col2 = 'B'),
    col3 type,
    col4 type) PARTITION BY LIST (col1, col2);

CREATE TABLE part_1a PARTITION OF my_partitioned_table
    FOR VALUES IN (1, 'A');

CREATE TABLE part_1b PARTITION OF my_partitioned_tabel
    FOR VALUES IN (1, 'B');

...

我需要一个正确的实现,因为在我的情况下,可能的分区组合是相当多的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-16 10:30:42

这是正确的,不能使用具有多个分区键的列表分区。您也不能弯曲范围分区来做您想做的事情。

但是,您可以使用一个复合类型来获得所需的内容:

代码语言:javascript
复制
CREATE TYPE part_type AS (a integer, b text);

CREATE TABLE partme (p part_type, val text) PARTITION BY LIST (p);

CREATE TABLE partme_1_B PARTITION OF partme FOR VALUES IN (ROW(1, 'B'));

INSERT INTO partme VALUES (ROW(1, 'B'), 'x');

INSERT INTO partme VALUES (ROW(1, 'C'), 'x');
ERROR:  no partition of relation "partme" found for row
DETAIL:  Partition key of the failing row contains (p) = ((1,C)).

SELECT (p).a, (p).b, val FROM partme;

 a | b | val 
---+---+-----
 1 | B | x
(1 row)

但是,最好的方法可能是使用子分区:将原始表按第一列划分,将分区按第二列划分。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63916696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档