相关疑难解决方法(0)

如何尽可能透明地将现有的Postgres表迁移到分区表?

我在postgres-DB中有一个现有表。为了演示,它是这样的:

create table myTable(
    forDate date not null,
    key2 int not null,
    value int not null,
    primary key (forDate, key2)
);

insert into myTable (forDate, key2, value) values
    ('2000-01-01', 1, 1),
    ('2000-01-01', 2, 1),
    ('2000-01-15', 1, 3),
    ('2000-03-02', 1, 19),
    ('2000-03-30', 15, 8),
    ('2011-12-15', 1, 11);
Run Code Online (Sandbox Code Playgroud)

但是,与这几个值相比,myTable实际上是巨大的,并且还在不断增长。我正在从该表中生成各种报告,但是目前我98%的报告使用一个月,其余查询的工作时间甚至更短。通常,我的查询使Postgres对这个巨大的表进行表扫描,而我正在寻找减少问题的方法。表分区似乎完全适合我的问题。我可以将桌子分成几个月。但是,如何将现有表转换为分区表?该手册明确指出:

无法将常规表转换为分区表,反之亦然

因此,我需要开发自己的迁移脚本,该脚本将分析当前表并将其迁移。需求如下:

  • 在设计时,myTable覆盖的时间框架是未知的。
  • 从该月的第一天到该月的最后一天,每个分区应覆盖一个月。
  • 该表将无限期增长,因此对于要生成多少个表,我没有理智的“停止值”
  • 结果应该尽可能透明,这意味着我想尽可能少地使用现有代码。在最佳情况下,这感觉就像是一张普通表,我可以在其中插入或选择它们而没有任何特殊之处。
  • 可以接受数据库停机以进行迁移
  • 与纯Postgres相处而无需在服务器上安装任何插件或其他东西的情况是高度首选的。
  • 数据库是PostgreSQL 10,无论如何迟早都会升级到较新版本,因此如果有帮助,则可以选择此选项

我该如何迁移要分区的表?

sql postgresql database-partitioning postgresql-10

5
推荐指数
1
解决办法
2388
查看次数