使用日期列的周数对数据库进行分区
Partition DB using the weeknumber of date column
所以我想将我的 Postgres (v11) 数据库分成几个分区。我已经想出如何通过使用我的日期范围来做到这一点。
CREATE TABLE test(
some_id int,
some_date date,
some_value int,
) PARTITION BY RANGE (some_date);
但是我想根据日期的周数进行分区。我尝试了以下代码但没有成功:
CREATE TABLE test(
some_id int,
some_date date,
some_value int,
) PARTITION BY DATE_PART('week', some_date);
有人知道吗?
这仍然是范围分区,您只是使用一个整数范围。 (列表分区在这里也可以很好地工作。)这是一个显示年度分区的缩写示例 - IRL,您将有 52 个分区,涵盖第 1-52 周,而不是我在这里显示的第 1、2、3-52 周。
testdb=# CREATE TABLE test( some_id int,
some_date date,
some_value int
) PARTITION BY range(DATE_PART('week', some_date));
CREATE TABLE
testdb=# create table test_week01 partition of test for values from (1) to (2);
CREATE TABLE
testdb=# create table test_week02 partition of test for values from (2) to (3);
CREATE TABLE
testdb=# create table test_week_rest partition of test for values from (3) to (MAXVALUE);
CREATE TABLE
testdb=# insert into test select 1, '2022-01-03', 2;
INSERT 0 1
testdb=# insert into test select 3, '2022-01-10', 4;
INSERT 0 1
testdb=# insert into test select 5, '2022-05-01', 6;
INSERT 0 1
testdb=# select tableoid::regclass, * from test;
tableoid | some_id | some_date | some_value
----------------+---------+------------+------------
test_week01 | 1 | 2022-01-03 | 2
test_week02 | 3 | 2022-01-10 | 4
test_week_rest | 5 | 2022-05-01 | 6
(3 rows)
所以我想将我的 Postgres (v11) 数据库分成几个分区。我已经想出如何通过使用我的日期范围来做到这一点。
CREATE TABLE test(
some_id int,
some_date date,
some_value int,
) PARTITION BY RANGE (some_date);
但是我想根据日期的周数进行分区。我尝试了以下代码但没有成功:
CREATE TABLE test(
some_id int,
some_date date,
some_value int,
) PARTITION BY DATE_PART('week', some_date);
有人知道吗?
这仍然是范围分区,您只是使用一个整数范围。 (列表分区在这里也可以很好地工作。)这是一个显示年度分区的缩写示例 - IRL,您将有 52 个分区,涵盖第 1-52 周,而不是我在这里显示的第 1、2、3-52 周。
testdb=# CREATE TABLE test( some_id int,
some_date date,
some_value int
) PARTITION BY range(DATE_PART('week', some_date));
CREATE TABLE
testdb=# create table test_week01 partition of test for values from (1) to (2);
CREATE TABLE
testdb=# create table test_week02 partition of test for values from (2) to (3);
CREATE TABLE
testdb=# create table test_week_rest partition of test for values from (3) to (MAXVALUE);
CREATE TABLE
testdb=# insert into test select 1, '2022-01-03', 2;
INSERT 0 1
testdb=# insert into test select 3, '2022-01-10', 4;
INSERT 0 1
testdb=# insert into test select 5, '2022-05-01', 6;
INSERT 0 1
testdb=# select tableoid::regclass, * from test;
tableoid | some_id | some_date | some_value
----------------+---------+------------+------------
test_week01 | 1 | 2022-01-03 | 2
test_week02 | 3 | 2022-01-10 | 4
test_week_rest | 5 | 2022-05-01 | 6
(3 rows)