Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb89c95d

Browse files
committed
pathman: documentation updated; append/prepend functions fixed (cache invalidation)
1 parent988030b commitb89c95d

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)

[8]ページ先頭

©2009-2025 Movatter.jp