Eu tenho uma tabela particionada nativamente por data. As partições abrangem 1 mês. Tenho outra tabela muito grande (19 GB) da qual desejo copiar os dados para a tabela particionada. Eu usei pg_partman
esse processo, porém o partman.partition_data_proc
procedimento levou 12 horas para mover 9 GB de dados para 60 novas partições. Para referência, estou usando o Postgres 15 no Amazon RDS (M5 Large).
Eu tentei usar partman.partition_data_proc
para mover os dados. Faça as seguintes perguntas, para um caso mais concreto:
-- NOTE: Both tables have more columns, this is a minimal example
CREATE TABLE IF NOT EXISTS table1(
id bigint not null,
date timestamp not null,
col_a integer,
col_b double precision,
col_c varchar(255)
);
-- insert some data into "table" at this step
-- for example using something like this:
-- insert into table (
-- "id",
-- "date",
-- "col_a" ,
-- "col_b",
-- "col_c"
-- )
-- select
-- i,
-- get_random_date_between(start:='10 years', end:='1 day'),
-- random()::int,
-- (random()* 100)::numeric(10, 2),
-- 'Some Text'
-- from
-- generate_series(1,300000000) s(i);
CREATE TABLE IF NOT EXISTS partitioned_table(
id bigint not null,
date timestamp not null,
col_a integer,
col_b double precision,
col_c varchar(255)
) PARTITION BY RANGE (date);
-- NOTE: you will need to have pg_partman extension installed
-- https://github.com/pgpartman/pg_partman
SELECT partman.create_parent(
p_parent_table => 'public.partitioned_table',
p_control => 'date',
p_interval => '1 month'
);
-- This operation takes a very long time
call partman.partition_data_proc(
p_parent_table := 'public.partitioned_table',
p_interval := '1 month',
p_source_table := 'public.table1'
);
Também tentei mover os dados com a funcionalidade de exportação/importação de dados do DBeaver (era mais lento e inseria dados na partição padrão). Existe uma maneira mais rápida de fazer isso? Gostaria de poder transferir os dados em menos de 8 horas e não precisar trocar a instância RDS por algo mais caro.