Я преобразую однораздельную таблицу в многораздельную таблицу в postgres 12. Предполагается, что я настроил новую таблицу разделов и создал соответствующие триггеры для автоматического c создания разделов, что является лучшим способом обратно заполнить пустую таблицу разделов?
Подходит ли наивный
insert into partitioned_table(a,d,b,c) select a, d, b, c from non_partitioned_table;
delete from non_partitioned_table;
? У нас в таблице ~ 250 миллионов строк, поэтому я немного обеспокоен удвоением требований к хранилищу.
Или, возможно,
WITH moved_rows AS (
DELETE FROM non_partitioned_table
)
INSERT INTO partitioned_table
SELECT [DISTINCT] * FROM moved_rows;
или
COPY non_partitioned_table TO '/tmp/non_partitioned_table.csv' DELIMITER ',';
COPY partitioned_table FROM '/tmp/non_partitioned_table.csv' DELIMITER ',';
В любом случае передача данных может занять некоторое время. Я также обеспокоен тем, что это снизит производительность INSERT во время переноса данных, поэтому я предполагаю, что нам нужно будет блокировать вставки, пока это не будет сделано. Есть ли способ оценить, сколько времени займет копирование данных?