我正在查看PostgreSQL 关于表分区的正式文档页,以获得我的postgres版本。
我想在三列上创建表分区,并且我希望使用带有BY LIST方法的声明式分区来实现这一点。
但是,我似乎找不到一个很好的例子,说明如何处理更多的列,特别是BY LIST。
在上述文档中,我只读到:
如果需要,可以决定在分区键中使用多列进行范围分区。(...)例如,考虑使用列lastname和range (按该顺序)作为分区键进行分区的表范围。
似乎多列上的声明性分区只适用于BY RANGE,还是不对?
但是,如果不是,我发现了对此的回答,它告诉我如何处理BY LIST和一列。但在我的例子中我有三栏。
我的想法是做以下事情(我很确定这是错误的):
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');
...我需要一个正确的实现,因为在我的情况下,可能的分区组合是相当多的。
发布于 2020-09-16 10:30:42
这是正确的,不能使用具有多个分区键的列表分区。您也不能弯曲范围分区来做您想做的事情。
但是,您可以使用一个复合类型来获得所需的内容:
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)但是,最好的方法可能是使用子分区:将原始表按第一列划分,将分区按第二列划分。
https://stackoverflow.com/questions/63916696
复制相似问题