我是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
答案 0 :(得分:0)
始终保持生产表的亮度总是更好,我做的一种做法是使用时间戳记并编写触发器函数,如果时间戳记小于now()(6个月的数据),该函数将在另一张表中插入行
答案 1 :(得分:0)
在创建范围分区时,由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