Skip to content

Commit b89c95d

Browse files
committed
pathman: documentation updated; append/prepend functions fixed (cache invalidation)
1 parent 988030b commit b89c95d

File tree

3 files changed

+52
-64
lines changed

3 files changed

+52
-64
lines changed

contrib/pg_pathman/README.rus.md

Lines changed: 41 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ EXPLAIN SELECT * FROM ONLY items;
196196
Рассмотрим пример разбиения таблицы по диапазону дат. Пусть у нас имеется таблица логов:
197197
```
198198
CREATE TABLE journal (
199-
id SERIAL PRIMARY KEY,
199+
id SERIAL,
200200
dt TIMESTAMP NOT NULL,
201201
level INTEGER,
202202
msg TEXT
@@ -213,74 +213,60 @@ SELECT create_range_partitions('journal', 'dt', '2015-01-01'::date, '1 day'::int
213213
```
214214
Новые секции добавляются автоматически при вставке новых записей в непокрытую область. Однако есть возможность добавлять секции вручную. Для этого можно воспользоваться следующими функциями:
215215
```
216-
SELECT add_partition()
216+
SELECT add_range_partition('journal', '2016-01-01'::date, '2016-01-07'::date);
217+
SELECT append_range_partition('journal');
217218
```
219+
Первая создает новую секцию с заданным диапазоном. Вторая создает новую секцию с интервалом, заданным при первоначальном разбиении, и добавляет ее в конец списка секций. Также можно присоеднинить существующую таблицу в качестве секции. Например, это может быть таблица с архивными данными, расположенная на другом сервере и подключенная с помощью fdw:
218220

219-
Объединим первые две секции:
220221
```
221-
SELECT merge_range_partitions('journal_1', 'journal_2');
222-
```
223-
Разделим первую секцию на две по дате '2010-02-15':
222+
CREATE FOREIGN TABLE journal_archive (
223+
id INTEGER NOT NULL,
224+
dt TIMESTAMP NOT NULL,
225+
level INTEGER,
226+
msg TEXT
227+
) SERVER archive_server;
224228
```
225-
SELECT split_range_partition('range_rel_1', '2010-02-15'::date);
229+
> Важно: структура подключаемой таблицы должна полностью совпадать с родительской.
230+
Подключим ее к имеющемуся разбиению:
226231
```
227-
Добавим новую секцию в конец списка секций:
232+
SELECT attach_range_partition('journal', 'journal_archive', '2014-01-01'::date, '2015-01-01'::date);
228233
```
229-
SELECT append_partition('range_rel');
234+
Устаревшие секции можно сливать с архивной:
230235
```
231-
Пример построения плана для запроса с фильтрацией по ключевому полю:
236+
SELECT merge_range_partitions('journal_archive', 'journal_1');
232237
```
233-
SELECT * FROM range_rel WHERE dt >= '2012-04-30' AND dt <= '2012-05-01';
234-
id | dt
235-
-----+---------------------
236-
851 | 2012-04-30 00:00:00
237-
852 | 2012-05-01 00:00:00
238-
239-
EXPLAIN SELECT * FROM range_rel WHERE dt >= '2012-04-30' AND dt <= '2012-05-01';
240-
QUERY PLAN
241-
----------------------------------------------------------------------------
242-
Append (cost=0.00..60.80 rows=0 width=0)
243-
-> Seq Scan on range_rel_28 (cost=0.00..30.40 rows=0 width=0)
244-
Filter: (dt >= '2012-04-30 00:00:00'::timestamp without time zone)
245-
-> Seq Scan on range_rel_29 (cost=0.00..30.40 rows=0 width=0)
246-
Filter: (dt <= '2012-05-01 00:00:00'::timestamp without time zone)
238+
Разделить ранее созданную секцию на две можно с помощью следующей функции, указав точку деления:
247239
```
248-
249-
### Деакцивация pathman
250-
Деактивировать pathman для некоторой ранее разделенной таблицы можно следующей командой disable_partitioning():
240+
SELECT split_range_partition('journal_366', '2016-01-03'::date);
251241
```
252-
SELECT disable_partitioning('range_rel');
242+
Чтобы отсоединить ранее созданную или присоединенную секцию воспользуйтесь функцией:
253243
```
254-
Все созданные секции и данные останутся по прежнему доступны и будут обрабатываться стандартным планировщиком PostgreSQL.
255-
### Ручное управление секциями
256-
Когда набора функций pg_pathman недостаточно для управления секциями, предусмотрено ручное управление. Можно создавать или удалять дочерние таблицы вручную, но после этого необходимо вызывать функцию:
244+
SELECT detach_range_partition('journal_archive');
257245
```
258-
on_update_partitions(oid),
259-
```
260-
которая обновит внутреннее представление структуры секций в памяти pg_pathman. Например, добавим новую секцию к ранее созданной range_rel:
261-
```
262-
CREATE TABLE range_rel_archive (CHECK (dt >= '2000-01-01' AND dt < '2010-01-01')) INHERITS (range_rel);
263-
SELECT on_update_partitions('range_rel'::regclass::oid);
264-
```
265-
CHECK CONSTRAINT должен иметь строго определенный формат:
266-
* (VARIABLE >= CONST AND VARIABLE < CONST) для RANGE секционированных таблиц;
267-
* (VARIABLE % CONST = CONST) для HASH секционированных таблиц.
268246

269-
Также можно добавить секцию, расположенную на удаленном сервере:
247+
Пример построения плана для запроса с фильтрацией по ключевому полю:
270248
```
271-
CREATE FOREIGN TABLE range_rel_archive (
272-
id INTEGER NOT NULL,
273-
dt TIMESTAMP)
274-
SERVER archive_server;
275-
ALTER TABLE range_rel_archive INHERIT range_rel;
276-
ALTER TABLE range_rel_archive ADD CHECK (dt >= '2000-01-01' AND dt < '2010-01-01');
277-
SELECT on_update_partitions('range_rel'::regclass::oid);
249+
SELECT * FROM journal WHERE dt >= '2015-06-01' AND dt < '2015-06-03';
250+
id | dt | level | msg
251+
--------+---------------------+-------+----------------------------------
252+
217441 | 2015-06-01 00:00:00 | 2 | 15053892d993ce19f580a128f87e3dbf
253+
217442 | 2015-06-01 00:01:00 | 1 | 3a7c46f18a952d62ce5418ac2056010c
254+
217443 | 2015-06-01 00:02:00 | 0 | 92c8de8f82faf0b139a3d99f2792311d
255+
...
256+
(2880 rows)
257+
258+
EXPLAIN SELECT * FROM journal WHERE dt >= '2015-06-01' AND dt < '2015-06-03';
259+
QUERY PLAN
260+
------------------------------------------------------------------
261+
Append (cost=0.00..58.80 rows=0 width=0)
262+
-> Seq Scan on journal_152 (cost=0.00..29.40 rows=0 width=0)
263+
-> Seq Scan on journal_153 (cost=0.00..29.40 rows=0 width=0)
264+
(3 rows)
278265
```
279-
Структура таблицы должна полностью совпадать с родительской.
280266

281-
В случае, если родительская таблица была удалена вручную с использованием инструкции DROP TABLE, необходимо удалить соответствующую строку из таблицы pathman_config и вызывать on_remove_partitions():
267+
### Деакцивация pg_pathman
268+
Деактивировать механизм pg_pathman для некоторой ранее разделенной таблицы можно следующей командой disable_partitioning():
269+
```
270+
SELECT disable_partitioning('journal');
282271
```
283-
SELECT on_remove_partitions('range_rel'::regclass::oid);
284-
DROP TABLE range_rel CASCADE;
285-
DELETE FROM pathman_config WHERE relname = 'public.range_rel';
286-
```
272+
Все созданные секции и данные останутся по прежнему доступны и будут обрабатываться стандартным планировщиком PostgreSQL.

contrib/pg_pathman/expected/pg_pathman.out

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,9 +486,11 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE dt BETWEEN '2014-12-15' A
486486
QUERY PLAN
487487
-------------------------------------------------------------------------------------
488488
Append
489+
-> Index Scan using range_rel_7_dt_idx on range_rel_7
490+
Index Cond: (dt >= 'Mon Dec 15 00:00:00 2014'::timestamp without time zone)
489491
-> Index Scan using range_rel_1_dt_idx on range_rel_1
490492
Index Cond: (dt <= 'Thu Jan 15 00:00:00 2015'::timestamp without time zone)
491-
(3 rows)
493+
(5 rows)
492494

493495
SELECT pathman.drop_range_partition('test.range_rel_7');
494496
drop_range_partition
@@ -801,17 +803,19 @@ EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt < '2010-03-01';
801803
QUERY PLAN
802804
--------------------------------
803805
Append
806+
-> Seq Scan on range_rel_15
804807
-> Seq Scan on range_rel_1
805808
-> Seq Scan on range_rel_13
806-
(3 rows)
809+
(4 rows)
807810

808811
EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt > '2010-12-15';
809812
QUERY PLAN
810813
--------------------------------------------------------------------------------
811814
Append
812815
-> Seq Scan on range_rel_12
813816
Filter: (dt > 'Wed Dec 15 00:00:00 2010'::timestamp without time zone)
814-
(3 rows)
817+
-> Seq Scan on range_rel_14
818+
(4 rows)
815819

816820
/* Create range partitions from whole range */
817821
SELECT drop_range_partitions('range_rel');

contrib/pg_pathman/range.sql

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -644,9 +644,8 @@ BEGIN
644644
INTO v_part_name
645645
USING p_relation, v_atttype, v_interval;
646646

647-
/* Tell backend to reload configuration */
648-
PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid);
649-
-- PERFORM @extschema@.on_update_partitions(p_relation::regclass::oid);
647+
/* Invalidate cache */
648+
PERFORM @extschema@.on_update_partitions(p_relation::regclass::oid);
650649

651650
/* Release lock */
652651
PERFORM @extschema@.release_partitions_lock();
@@ -715,9 +714,8 @@ BEGIN
715714
INTO v_part_name
716715
USING p_relation, v_atttype, v_interval;
717716

718-
/* Tell backend to reload configuration */
719-
PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid);
720-
-- PERFORM @extschema@.on_update_partitions(p_relation::regclass::oid);
717+
/* Invalidate cache */
718+
PERFORM @extschema@.on_update_partitions(p_relation::regclass::oid);
721719

722720
/* Release lock */
723721
PERFORM @extschema@.release_partitions_lock();

0 commit comments

Comments
 (0)