Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Обслуживание секций  [new]
DSKalugin
Member

Откуда: Мать городов русских
Сообщений: 363
Есть секционированная таблица ru.propose_sod и её секция private.propose_sod_ru_2019 с данными за 2019г размером 1,8ТБ
Планирую заменить период секционирования с "годового" на "помесячный" (слишком медленно выполняются запросы + сложности в обслуживании секций)
Можно ли в наполненной секции заменить верхнюю границу диапазона с '2020-01-01' на '2019-11-01'?
Не повлечет ли это действие риск потери данных или выделение дополнительного пространства на диске (который и так переполнен) или блокировку таблицы на длительное время... ?
-- секционированная таблица
CREATE TABLE ru.propose_sod (
  id BIGSERIAL,
  receive_id INTEGER DEFAULT 0 NOT NULL,
  date_begin DATE NOT NULL,
  balance_begin REAL DEFAULT 0 NOT NULL,
  quantity_credit REAL DEFAULT 0 NOT NULL,
  price_credit REAL DEFAULT 0 NOT NULL,
  quantity_debit REAL DEFAULT 0 NOT NULL,
  price_debit REAL DEFAULT 0 NOT NULL,
  drugs_sha1 VARCHAR(40),
  flag_set SMALLINT DEFAULT 0 NOT NULL
) 
PARTITION BY RANGE (date_begin)
WITH (oids = false);
-- секция
CREATE TABLE private.propose_sod_ru_2019 PARTITION OF ru.propose_sod(
  CONSTRAINT pk_propose_sod_ru_2019 PRIMARY KEY(id),
  CONSTRAINT fk_propose_sod_ru_2019_r FOREIGN KEY (receive_id)
    REFERENCES ru.receive_day(id)
    ON DELETE CASCADE
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) 
FOR VALUES FROM ('2019-01-01') TO ('2020-01-01')
WITH (oids = false)
TABLESPACE arch_global;

CREATE INDEX propose_sod_ru_2019_date_begin_idx ON private.propose_sod_ru_2019
  USING btree (date_begin)
  TABLESPACE arch_global;

CREATE INDEX propose_sod_ru_2019_drugs_sha1 ON private.propose_sod_ru_2019
  USING btree (drugs_sha1 COLLATE pg_catalog."default")
  TABLESPACE arch_global;

CREATE INDEX propose_sod_ru_2019_rcv_id ON private.propose_sod_ru_2019
  USING btree (receive_id)
  TABLESPACE arch_global;
-- мастер
CREATE TABLE ru.receive_day (
  id SERIAL,
  organization_id INTEGER DEFAULT 0 NOT NULL,
  date_receive TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
  date_begin DATE,
  date_end DATE,
  price_sum DOUBLE PRECISION DEFAULT 0 NOT NULL,
  total_positions INTEGER DEFAULT 0 NOT NULL,
  unknown_positions INTEGER DEFAULT 0 NOT NULL,
  hash_data VARCHAR(40) DEFAULT ''::character varying NOT NULL,
  flag_set INTEGER DEFAULT 0 NOT NULL,
  meta JSONB,
  CONSTRAINT pk_ps_receive_so_ru PRIMARY KEY(id)
) 
WITH (oids = false);
CREATE INDEX ps_receive_so_ru_idx_db ON ru.receive_day
  USING btree (date_begin);

CREATE INDEX ps_receive_so_ru_idx_o ON ru.receive_day
  USING btree (organization_id);


PostgreSQL 11 / Ubuntu / Размер БД 7,2ТБ / Заполненность диска 96%(!)
18 окт 19, 14:46    [21997477]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
lr2
Member

Откуда:
Сообщений: 118
+
SET friday_mode = ON;


Сначала хорошо бы сделать VACUUM FULL.
18 окт 19, 14:51    [21997483]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1074
alter table private.propose_sod_ru_2019 add constraint tmp_attach check (date_begin >= '2019-01-01' and date_begin < '2019-11-01') not valid;
alter table private.propose_sod_ru_2019 validate constraint tmp_attach;
alter table ru.propose_sod DETACH PARTITION  private.propose_sod_ru_2019;
alter table ru.propose_sod ATTACH PARTITION private.propose_sod_ru_2019 FOR VALUES FROM ('2019-01-01') TO ('2019-11-01');
alter table private.propose_sod_ru_2019 drop constraint tmp_attach;


без check attach partition будет проверять данные на соответствие ограничению. (seqscan в один поток без индексов)
18 окт 19, 14:55    [21997491]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
DSKalugin
Member

Откуда: Мать городов русских
Сообщений: 363
lr2
Сначала хорошо бы сделать VACUUM FULL.

Это повлечет за собой блокировку и выделение места ~ 1,8ТБ для пересоздания таблицы. А места уже нет :-(
18 окт 19, 15:14    [21997512]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
DSKalugin
Member

Откуда: Мать городов русских
Сообщений: 363
Melkij, спасибо!
18 окт 19, 15:46    [21997536]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
MacArrow
Member

Откуда:
Сообщений: 45
Добрый вечер!

Подскажите пожалуйста, а можно где-нибудь в Postgres посмотреть границы уже созданной секции RANGE?
13 май 20, 18:13    [22132318]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
DSKalugin
Member

Откуда: Мать городов русских
Сообщений: 363
MacArrow,

в DDL секции
22 май 20, 16:58    [22137819]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
MacArrow
Member

Откуда:
Сообщений: 45
DSKalugin,

Спасибо! Это понятно, особенно теоретически...

А есть какие-то таблицы, представления, "хранимки", из которых по запросу можно получить необходимые данные о секции, в том числе и границы диапазона?
15 июн 20, 15:07    [22151054]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1074
MacArrow
А есть какие-то таблицы, представления, "хранимки", из которых по запросу можно получить необходимые данные о секции, в том числе и границы диапазона?

Технически это pg_class.relpartbound. Но это pg_node_tree. pg_dump и psql с ним работают просто как с данностью (psql вызывает именно так):
SELECT c.oid::pg_catalog.regclass, pg_catalog.pg_get_expr(c.relpartbound, c.oid), c.relkind FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhrelid AND i.inhparent = '159622' ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT', c.oid::pg_catalog.regclass::pg_catalog.text;
В результате получается всё выражение текстом, например "FOR VALUES FROM ('2020-04-01 00:00:00') TO ('2020-05-01 00:00:00')"
15 июн 20, 16:20    [22151114]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
MacArrow
Member

Откуда:
Сообщений: 45
Melkij,

Большое спасибо!

А вот ещё вопрос: можно ли по значению ключа секции определить саму секцию (имя)?

Сообщение было отредактировано: 18 июн 20, 22:29
18 июн 20, 22:24    [22153278]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1074
MacArrow,

емнип tuple routing из backend'а не экспортирован никак.
19 июн 20, 13:36    [22153629]     Ответить | Цитировать Сообщить модератору
 Re: Обслуживание секций  [new]
MacArrow
Member

Откуда:
Сообщений: 45
Melkij,

Понятно! Спасибо!
28 июн 20, 15:59    [22158602]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить