PostgreSQL10-是否可以按列表进行分区(col1,col2,…,colN)?
我正在查看PostgreSQL以获取我的postgres版本 我希望在三列上创建表分区,我希望使用声明性分区和PostgreSQL10-是否可以按列表进行分区(col1,col2,…,colN)?,postgresql,partitioning,postgresql-10,Postgresql,Partitioning,Postgresql 10,我正在查看PostgreSQL以获取我的postgres版本 我希望在三列上创建表分区,我希望使用声明性分区和BY LIST方法来实现这一点 然而,我似乎找不到一个好的例子来说明如何处理更多的列,尤其是按列表处理 在上述文件中,我只阅读了: 您可以决定在分区键中为范围使用多列 分区,如果需要的话。(…)例如,考虑表范围 使用列lastname和firstname(按该顺序)作为 分区键 多个列上的声明性分区似乎只适用于按范围划分的,,或者这不对吗 然而,如果不是,我发现它告诉我如何通过列表和一列
BY LIST
方法来实现这一点
然而,我似乎找不到一个好的例子来说明如何处理更多的列,尤其是按列表处理
在上述文件中,我只阅读了:
您可以决定在分区键中为范围使用多列
分区,如果需要的话。(…)例如,考虑表范围
使用列lastname和firstname(按该顺序)作为
分区键
多个列上的声明性分区似乎只适用于按范围划分的,
,或者这不对吗
然而,如果不是,我发现它告诉我如何通过列表和一列来处理。但就我而言,我有三个专栏
我的想法是做如下事情(我很确定这是错误的):
我需要一个正确的实现,因为在我的例子中,可能的分区的组合相当多。没错,不能使用具有多个分区键的列表分区。您也不能弯曲范围分区来做您想做的事情
但您可以使用复合类型来获得所需的:
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)
但也许最好的方法是使用子分区:将原始表按第一列进行分区,并按第二列进行分区。谢谢您提供的信息!子分区呢?这会更糟吗?像为(1)分区列表(col2)中的值创建my_partitioned_表的表part_1分区代码>啊,你是对的。你为什么问你有没有比我更好的主意?:^)@一匹没有名字的马有点粗俗,但我不知道为什么不支持它。@一匹没有名字的马在文档或代码中有什么东西说它不受支持吗?
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)