【问题标题】:Move partition from one table to another table PostgreSQL 10.11将分区从一个表移动到另一个表 PostgreSQL 10.11
【发布时间】:2020-07-24 15:11:56
【问题描述】:

我是 postgreSQL 的新手,我正在做一个项目,要求我将所有超过 6 个月的分区移动到旧表中,以便对表的查询更快。我有 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

 

【问题讨论】:

    标签: postgresql postgresql-10


    【解决方案1】:

    最好保持生产表轻便,我做的一种做法是使用时间戳并编写触发器函数,如果时间戳小于 now()(6 个月大的数据),它将在另一个表中插入行.

    【讨论】:

    • 6个月后生产表中的数据会有6个月以上的数据,最终需要额外维护删除6个月以上的信息
    【解决方案2】:

    Quote from the manual

    在创建范围分区时,用 FROM 指定的下限是包含边界,而用 TO 指定的上限是不包含边界

    (强调我的)

    所以表达式 to ('2003-30-03') 不允许将 March, 30st 插入分区。

    此外,mytable_200003 中的数据是 2000 年的,而不是 2003 年(您在分区定义中使用的)。要指定完整的行军,只需使用 April, 1st 作为上限

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

    alter table mytable_legacy 
       attach partition mytable_200003 
       for values from ('2000-03-01') to ('2000-04-01');
                            ^ here            ^ here
    

    Online example

    【讨论】:

    • 当我将上限更改为“2003-04-01”时,我遇到了同样的错误
    • 从 mytable_legacy 中选择 *; - 没有返回任何行,mytable_200003 分区只有上述两行;
    • @Dpk:您的数据是 2000 年的,但您的分区定义是 2003 年的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2013-11-18
    • 2012-04-07
    相关资源
    最近更新 更多