Как партиционировать большую таблицу в PG 11?

Есть очень большая таблица на 5TB, сейчас это один кусок данных
(сама таблица оч простая:)

Table "public.history"
Column | Type | Collation | Nullable | Default
--------+---------------+-----------+----------+---------
itemid | bigint | | not null |
clock | integer | | not null | 0
value | numeric(16,4) | | not null | 0.0000
ns | integer | | not null | 0
Indexes:
"history_1" btree (itemid, clock)

Как можно её партиционировать не вызывая долгие простои в бэкенде на запись в эту таблицу? чтобы в будущем я мог дропнуть одну партицию в 5tb а не удалять записи данных по частям целыми днями.
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
если clock это unixtime, а так же именно по нему и хотим партиционировать в дальнейшем:

begin;
set local statement_timeout to '100ms';
alter table history add constraint partition_key check (clock < :N) not valid;
commit;
alter table history validate constraint partition_key;
begin;
set local statement_timeout to '100ms';
alter table history rename to history_old_data;
create table history (...) partition by range (clock);
alter table history attach partition history_old_data for values from (minvalue) to (:N);
create table history_part_... partition of history for values from (:N) to (...);
commit;


:N - некая дата в будущем, до неё данные будут писаться в старую 5тб табличку, после - в новую партицию. Если до выбранного :N не успеете завершить миграцию - то удалить check constraint, иначе запись, конечно, встанет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы