将分区从一个表移动到另一个表PostgreSQL 10.11

时间:2020-07-24 05:35:29

标签: postgresql postgresql-10

我是PostgreSQL的新手,我正在一个项目中,我被要求将所有六个月以上的分区都移到旧表中,以便对表的查询更快。我的分区表有10年的数据。

让我们假设myTable是具有当前6个月数据的表,并且myTable_legacy将使所有数据早于6个月且长达10年。该表按月范围划分

我在网上研究但无法得出结论的问题是

我目前正在完成步骤之前进行测试,我正在使用下面的链接作为我的实验室测试的参考,并且在执行实际迁移之前。

How to migrate an existing Postgres Table to partitioned table as transparently as possible?

 create table myTable(
 forDate date not null,
 key2 int not null,
 value int not null
 ) partition by range (forDate);


 create table myTable_legacy(
 forDate date not null,
 key2 int not null,
 value int not null
 ) partition by range (forDate);

1)每天仅对当前6个月的数据进行一次应用查询。是否有必要将6个月以上的数据移至新分区,以获得更好的查询响应。我在网上进行了研究,但找不到与之相关的任何确凿证据。

2)如果性能会更好,如何将较旧的分区从myTable移到myTable_legacy。根据我的研究,我发现PostgreSQL中没有交换分区的选项。

任何帮助或指导都可以帮助我进一步满足要求。

当我尝试将分区附加到mytable_legacy时,出现错误

 alter table mytable detach partition mytable_200003;
 alter table mytable_legacy attach partition mytable_200003 
      for values from ('2003-03-01') to ('2003-03-30');

导致:

错误:某些行违反了分区约束
SQL状态:23514

分区的内容:

select * from mytable_200003;

"2000-03-02"    1   19
"2000-03-30"    15  8

 

2 个答案:

答案 0 :(得分:0)

始终保持生产表的亮度总是更好,我做的一种做法是使用时间戳记并编写触发器函数,如果时间戳记小于now()(6个月的数据),该函数将在另一张表中插入行

答案 1 :(得分:0)

Quote from the manual

在创建范围分区时,由FROM指定的下限是一个包含范围,而由TO指定的上限是一个专有范围

(重点是我的)

因此,表达式> a [,1] [,2] [,3] [1,] 7 65 1 [2,] 11 7 77 [3,] 22 8 34 不允许将3月30日插入分区。

此外,您在to ('2003-30-03')中的数据用于<​​strong> 2000 年,而不是用于2003年(在分区定义中使用)。要指定完整的游行,只需使用1月4日作为上限

因此,您需要将分区定义更改为覆盖 2000 而不是2003年3月。

mytable_200003

Online example

相关问题