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

Commitbe81c9f

Browse files
committed
pathman: documentation (not finished)
1 parentc746358 commitbe81c9f

File tree

7 files changed

+315
-254
lines changed

7 files changed

+315
-254
lines changed

‎contrib/pathman/README.md‎

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
#pathman
2+
3+
The`pathman` module provides optimized partitioning mechanism and functions to manage partitions.
4+
5+
##pathman Concepts
6+
7+
Partitioning refers to splitting one large table into smaller pieces. Each row in such table assigns to a single partition based on partitioning key. Common partitioning strategies are:
8+
9+
* HASH - maps rows to partitions based on hash function values;
10+
* RANGE - maps data to partitions based on ranges that you establish for each partition;
11+
* LIST - maps data to partitions based on explicitly specified values of partitioning key for each partition.
12+
13+
PostgreSQL supports partitioning via table inheritance. Each partition must be created as child table with CHECK CONSTRAINT. For example:
14+
15+
```
16+
CHECK ( id >= 100 AND id < 200 )
17+
CHECK ( id >= 200 AND id < 300 )
18+
```
19+
20+
Despite the flexibility of this approach it has weakness. If query uses filtering the optimizer forced to perform an exhaustive search and check constraints for each partition to determine partitions from which it should select data. If the number of partitions is large the overhead may be significant.
21+
22+
The`pathman` module provides functions to manage partitions and partitioning mechanism optimized based on knowledge of the partitions structure. It stores partitioning configuration in the`pathman_config` table, each row of which contains single entry for partitioned table (relation name, partitioning key and type). During initialization the`pathman` module caches information about child partitions in shared memory in form convenient to perform rapid search. When user executes SELECT query pathman analyzes conditions tree looking for conditions like:
23+
24+
```
25+
VARIABLE OP CONST
26+
```
27+
where`VARIABLE` is partitioning key,`OP` is comparison operator (supported operators are =, <, <=, >, >=),`CONST` is scalar value. For example:
28+
29+
```
30+
WHERE id = 150
31+
```
32+
33+
Based on partitioning type and operator the`pathman` searches corresponding partitions and builds the plan.
34+
35+
##Функции pathman
36+
37+
###Создание секций
38+
```
39+
CREATE FUNCTION create_hash_partitions(
40+
relation TEXT,
41+
attribute TEXT,
42+
partitions_count INTEGER)
43+
```
44+
Выполняет HASH-секционирование таблицы`relation` по целочисленному полю`attribute`. Создает`partitions_count` дочерних секций, а также триггер на вставку. Данные из родительской таблицы не копируются автоматически в дочерние. Миграцию данных можно выполнить с помощью функции`partition_data()` (см. ниже), либо вручную.
45+
46+
```
47+
CREATE FUNCTION create_range_partitions(
48+
relation TEXT,
49+
attribute TEXT,
50+
start_value ANYELEMENT,
51+
interval ANYELEMENT,
52+
premake INTEGER)
53+
```
54+
Выполняет RANGE-секционирование таблицы`relation` по полю`attribute`. Аргумент`start_value` задает начальное значение,`interval` -- диапазон значений внутри одной секции,`premake` -- количество заранее создаваемых секций (если 0, то будет создана единственная секция).
55+
```
56+
CREATE FUNCTION create_range_partitions(
57+
relation TEXT,
58+
attribute TEXT,
59+
start_value ANYELEMENT,
60+
interval INTERVAL,
61+
premake INTEGER)
62+
```
63+
Аналогично предыдущей с тем лишь отличием, что данная функция предназначена для секционирования по полю типа`DATE` или`TIMESTAMP`.
64+
65+
###Миграция данных
66+
```
67+
CREATE FUNCTION partition_data(parent text)
68+
```
69+
Копирует данные из родительской таблицы`parent` в дочерние секции.
70+
71+
###Управление секциями
72+
```
73+
CREATE FUNCTION split_range_partition(partition TEXT, value ANYELEMENT)
74+
```
75+
Разбивает RANGE секцию`partition` на две секции по значению`value`.
76+
```
77+
CREATE FUNCTION merge_range_partitions(partition1 TEXT, partition2 TEXT)
78+
```
79+
Объединяет две смежные RANGE секции. Данные из`partition2` копируются в`partition1`, после чего секция`partition2` удаляется.
80+
```
81+
CREATE FUNCTION append_partition(p_relation TEXT)
82+
```
83+
Добавляет новую секцию в конец списка секций. Диапазон значений устанавливается равным последней секции.
84+
```
85+
CREATE FUNCTION prepend_partition(p_relation TEXT)
86+
```
87+
Добавляет новую секцию в начало списка секций.
88+
```
89+
CREATE FUNCTION disable_partitioning(relation TEXT)
90+
```
91+
Отключает механизм секционирования`pathman` для заданной таблицы и удаляет триггер на вставку. При этом созданные ранее секции остаются без изменений.
92+
93+
##Примеры использования
94+
###HASH
95+
Рассмотрим пример секционирования таблицы, используя HASH-стратегию на примере таблицы.
96+
```
97+
CREATE TABLE hash_rel (
98+
id SERIAL PRIMARY KEY,
99+
value INTEGER);
100+
INSERT INTO hash_rel (value) SELECT g FROM generate_series(1, 10000) as g;
101+
```
102+
Разобьем таблицу`hash_rel` на 100 секций по полю`value`:
103+
```
104+
SELECT create_hash_partitions('hash_rel', 'value', 100);
105+
```
106+
Перенсем данные из родительской таблицы в дочерние секции.
107+
```
108+
SELECT partition_data('hash_rel');
109+
```
110+
###RANGE
111+
Пример секционирования таблицы с использованием стратегии RANGE.
112+
```
113+
CREATE TABLE range_rel (
114+
id SERIAL PRIMARY KEY,
115+
dt TIMESTAMP);
116+
INSERT INTO range_rel (dt) SELECT g FROM generate_series('2010-01-01'::date, '2015-12-31'::date, '1 day') as g;
117+
```
118+
Разобьем таблицу на 60 секций так, чтобы каждая секция содержала данные за один месяц:
119+
```
120+
SELECT create_range_partitions('range_rel', 'dt', '2010-01-01'::date, '1 month'::interval, 59);
121+
```
122+
>Значение`premake` равно 59, а не 60, т.к. 1 секция создается независимо от значения`premake`
123+
124+
Перенсем данные из родительской таблицы в дочерние секции.
125+
```
126+
SELECT partition_data('range_rel');
127+
```
128+
Объединим секции первые две секции:
129+
```
130+
SELECT merge_range_partitions('range_rel_1', 'range_rel_2');
131+
```
132+
Разделим первую секцию на две по дате '2010-02-15':
133+
```
134+
SELECT split_range_partition('range_rel_1', '2010-02-15'::date);
135+
```
136+
Добавим новую секцию в конец списка секций:
137+
```
138+
SELECT append_partition('range_rel')
139+
```

‎contrib/pathman/README.rus.md‎

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
#pathman
2+
3+
Модуль`pathman` предоставляет оптимизированный механизм секционирования, а также функции для создания и управления секциями.
4+
5+
##Концепция pathman
6+
7+
Секционирование -- это способ разбиения одной большой таблицы на множество меньших по размеру. Для каждой записи можно однозначно определить секцию, в которой она должна храниться посредством вычисления ключа. Традиционно выделяют три стратегии секционирования:
8+
9+
* HASH - данные равномерно распределяются по секциям в соответствии со значениями hash-функции, вычисленными по некоторому атрибуту;
10+
* RANGE - данные распределяются по секциям, каждая из которых ответственна за заданный диапазон значений аттрибута;
11+
* LIST - для каждой секции определяется набор конкретных значений атрибута.
12+
13+
Секционирование в postgres основано на механизме наследования. Каждому наследнику задается условие CHECK CONSTRAINT. Например:
14+
15+
```
16+
CHECK ( id >= 100 AND id < 200 )
17+
CHECK ( id >= 200 AND id < 300 )
18+
```
19+
20+
Несмотря на гибкость, этот механизм обладает недостатками. Так при фильтрации данных оптимизатор вынужден перебирать все дочерние секции и сравнивать условие запроса с CHECK CONSTRAINT-ами секции, чтобы определить из каких секций ему следует загружать данные. При большом количестве секций это создает дополнительные накладные расходы, которые могут свести на нет выигрыш в производительности от применения секционирования.
21+
22+
Модуль `pathman` предоставляет функции для создания и управления секциями (см. следующий раздел) и механизм секционирования, оптимизированный с учетом знания о стуктуре дочерних таблиц. Конфигурация сохраняется таблице `pathman_config`, каждая строка которой содержит запись для одной секционированной таблицы (название таблицы, аттрибут и тип разбиения). В процессе инициализации модуля в разделяемую память сохраняется конфигурация дочерних таблиц в удобном для поиска формате. Получив запрос типа `SELECT` к секционированной таблице, `pathman` анализирует дерево условий запроса и выделяет из него условия вида:
23+
24+
```
25+
ПЕРЕМЕННАЯ ОПЕРАТОР КОНСТАНТА
26+
```
27+
где`ПЕРЕМЕННАЯ` -- это аттрибут, по которому было выполнено разбиение,`ОПЕРАТОР` -- оператор сравнения (поддерживаются =, <, <=, >, >=),`КОНСТАНТА` -- скалярное значение. Например:
28+
29+
```
30+
WHERE id = 150
31+
```
32+
33+
##Функции pathman
34+
35+
###Создание секций
36+
```
37+
CREATE FUNCTION create_hash_partitions(
38+
relation TEXT,
39+
attribute TEXT,
40+
partitions_count INTEGER)
41+
```
42+
Выполняет HASH-секционирование таблицы`relation` по целочисленному полю`attribute`. Создает`partitions_count` дочерних секций, а также триггер на вставку. Данные из родительской таблицы не копируются автоматически в дочерние. Миграцию данных можно выполнить с помощью функции`partition_data()` (см. ниже), либо вручную.
43+
44+
```
45+
CREATE FUNCTION create_range_partitions(
46+
relation TEXT,
47+
attribute TEXT,
48+
start_value ANYELEMENT,
49+
interval ANYELEMENT,
50+
premake INTEGER)
51+
```
52+
Выполняет RANGE-секционирование таблицы`relation` по полю`attribute`. Аргумент`start_value` задает начальное значение,`interval` -- диапазон значений внутри одной секции,`premake` -- количество заранее создаваемых секций (если 0, то будет создана единственная секция).
53+
```
54+
CREATE FUNCTION create_range_partitions(
55+
relation TEXT,
56+
attribute TEXT,
57+
start_value ANYELEMENT,
58+
interval INTERVAL,
59+
premake INTEGER)
60+
```
61+
Аналогично предыдущей с тем лишь отличием, что данная функция предназначена для секционирования по полю типа`DATE` или`TIMESTAMP`.
62+
63+
###Миграция данных
64+
```
65+
CREATE FUNCTION partition_data(parent text)
66+
```
67+
Копирует данные из родительской таблицы`parent` в дочерние секции.
68+
69+
###Управление секциями
70+
```
71+
CREATE FUNCTION split_range_partition(partition TEXT, value ANYELEMENT)
72+
```
73+
Разбивает RANGE секцию`partition` на две секции по значению`value`.
74+
```
75+
CREATE FUNCTION merge_range_partitions(partition1 TEXT, partition2 TEXT)
76+
```
77+
Объединяет две смежные RANGE секции. Данные из`partition2` копируются в`partition1`, после чего секция`partition2` удаляется.
78+
```
79+
CREATE FUNCTION append_partition(p_relation TEXT)
80+
```
81+
Добавляет новую секцию в конец списка секций. Диапазон значений устанавливается равным последней секции.
82+
```
83+
CREATE FUNCTION prepend_partition(p_relation TEXT)
84+
```
85+
Добавляет новую секцию в начало списка секций.
86+
```
87+
CREATE FUNCTION disable_partitioning(relation TEXT)
88+
```
89+
Отключает механизм секционирования`pathman` для заданной таблицы и удаляет триггер на вставку. При этом созданные ранее секции остаются без изменений.
90+
91+
##Примеры использования
92+
###HASH
93+
Рассмотрим пример секционирования таблицы, используя HASH-стратегию на примере таблицы.
94+
```
95+
CREATE TABLE hash_rel (
96+
id SERIAL PRIMARY KEY,
97+
value INTEGER);
98+
INSERT INTO hash_rel (value) SELECT g FROM generate_series(1, 10000) as g;
99+
```
100+
Разобьем таблицу`hash_rel` на 100 секций по полю`value`:
101+
```
102+
SELECT create_hash_partitions('hash_rel', 'value', 100);
103+
```
104+
Перенсем данные из родительской таблицы в дочерние секции.
105+
```
106+
SELECT partition_data('hash_rel');
107+
```
108+
###RANGE
109+
Пример секционирования таблицы с использованием стратегии RANGE.
110+
```
111+
CREATE TABLE range_rel (
112+
id SERIAL PRIMARY KEY,
113+
dt TIMESTAMP);
114+
INSERT INTO range_rel (dt) SELECT g FROM generate_series('2010-01-01'::date, '2015-12-31'::date, '1 day') as g;
115+
```
116+
Разобьем таблицу на 60 секций так, чтобы каждая секция содержала данные за один месяц:
117+
```
118+
SELECT create_range_partitions('range_rel', 'dt', '2010-01-01'::date, '1 month'::interval, 59);
119+
```
120+
>Значение`premake` равно 59, а не 60, т.к. 1 секция создается независимо от значения`premake`
121+
122+
Перенсем данные из родительской таблицы в дочерние секции.
123+
```
124+
SELECT partition_data('range_rel');
125+
```
126+
Объединим секции первые две секции:
127+
```
128+
SELECT merge_range_partitions('range_rel_1', 'range_rel_2');
129+
```
130+
Разделим первую секцию на две по дате '2010-02-15':
131+
```
132+
SELECT split_range_partition('range_rel_1', '2010-02-15'::date);
133+
```
134+
Добавим новую секцию в конец списка секций:
135+
```
136+
SELECT append_partition('range_rel')
137+
```

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp