Top Banner
www.postgrespro.ru Секционирование без границ Мусин Ильдар
43

"Секционирование без границ" Ильдар Мусин (Postgres Professional)

Jan 17, 2017

Download

Internet

AvitoTech
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

www.postgrespro.ru

Секционирование без границ

Мусин Ильдар

Page 2: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Секционирование

big table

partition 1 partition 2 partition 3

Page 3: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Пример секционирования

id title city1 Велосипед Москва2 Вафельница Санкт-Петербург3 Фотоаппарат Москва4 Контрабас Санкт-Петербург

id title city1 Велосипед Москва3 Фотоаппарат Москва

id title city2 Вафельница Санкт-Петербург4 Контрабас Санкт-Петербург

items

items_msc items_spb

Page 4: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Виды секционирования

Январь

Февраль

Март

Апрель

RANGE

h1

h2

h3

h4

HASH

УфаЧелябинскПермь

СамараСаратов

ВладивостокХабаровск

LIST

Page 5: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Преимущества секционирования

● Рост производительности при условии, что наиболее часто используемые данные находятся в небольшом числе секций.

● Использование последовательного доступа к небольшим секциям вместо индекса или случайного доступа к одной большой таблице.

● Управление большими объемами данных. ● Редко используемые данные могут быть вынесены на более дешевые и медленные носители.

Page 6: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Когда нужно секционировать?

● Эмпирическое правило: размер таблицы превышает размер физической памяти.

● Таблица содержит исторические данные, а новые записи добавляются в последнюю секцию.

● Содержимое таблицы должно быть распределено между дисками или серверами.

Page 7: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Секционирование в PostgreSQL

Trigger

parent

child_1 child_2 child_3

checkcheck check

Page 8: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Виды секционирования в PostgreSQL

● RANGE CHECK(dt_created >= '2015-01-01' AND dt_created < '2016-01-01')

● LIST CHECK(city IN (‘Уфа’, ‘Оренбург’, ‘Челябинск’))

● HASH (?) CHECK( id % 10 = 0) … CHECK( id % 10 = 9)

SELECT * FROM my_table WHERE id = 5 AND (id % 10) = (5 % 10)

Page 9: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Проблемы

● Полный перебор при поиске подходящих секций (constraint exclusion)

● Нет встроенной поддержки HASH-секционирования

● Ручное управление секциями

Page 10: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Решение

Определить структуры данных, над которыми можно выполнять эффективный поиск

RANGE • бинарный поиск в сортированном массиве • поиск в бинарном дереве

HASH, LIST • хеш-таблица

O(log2N)

≈ O(1)

Page 11: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Этапы обработки запроса

Parser

Rewriter

Planner

Executor

Page 12: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Используемые средства

Hook-функции — лазейки, используемые для внедрения в код СУБД: • planner_hook • set_rel_pathlist_hook

Path — прототип планов. Для каждой таблицы, используемой в запросе, строятся всевозможные способы обхода, из которых выбирается лучший. На его основе строится узел плана.

Page 13: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

ordersid integer

dt_created timestamp

customer_id integer

city_id integer

Page 14: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

ordersid integer

dt_created timestamp

customer_id integer

city_id integer

orders_1 orders_2 orders_3

[2016-01-01; 2016-02-01)

[2016-02-01; 2016-03-01) [2016-03-01; 2016-04-01)

Page 15: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Cache

OID Partitioning info

431287

431290

431295

431299partitioning type RANGE

attribute dt_create

attribute type timestamp

children ■■■■■■■■■

Page 16: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Cache

partitioning type RANGE

attribute dt_create

attribute type timestamp

children ■■■■■■■■■

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Page 17: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Дерево выражений

OR

AND

>=

const:2016-01-01

var:dt_created

<

const:2016-02-15

=

const:2016-03-15

var:dt_created

SELECT * FROM ordersWHERE (dt_created >= ‘2016-01-01’ AND dt_created <= ‘2016-02-15’) OR (dt_created = ‘2016-03-15’ AND city_id=15)

AND

=

const:15

var:city_id

var:dt_created

Page 18: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Дерево выражений

OR

AND

>=

const:2016-01-01

var:dt_created

<

const:2016-02-15

=

const:2016-03-15

var:dt_created

SELECT * FROM ordersWHERE (dt_created >= ‘2016-01-01’ AND dt_created <= ‘2016-02-15’) OR (dt_created = ‘2016-03-15’ AND city_id=15)

AND

=

const:15

var:city_id

var:dt_created

Page 19: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Дерево выражений

OR

AND

>=

const:2016-01-01

var:dt_created

<

const:2016-02-15

=

const:2016-03-15

var:dt_created

SELECT * FROM ordersWHERE (dt_created >= ‘2016-01-01’ AND dt_created <= ‘2016-02-15’) OR (dt_created = ‘2016-03-15’ AND city_id=15)

AND

=

const:15

var:city_id

var:dt_created

Page 20: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Поиск RANGE-секции

Ищем секцию, содержащую CONST

KEY OP CONST

OP

[0; pos] [pos; pos] [pos; ∞)

<, <= >, >=

=

бинарный поиск

pos — позиция в массиве children

Page 21: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Обработка булевых операторов

Вычисляем EXPR1, Вычисляем EXPR2

EXPR1 BOOL_OP EXPR2

BOOL_OP

Пересечение Объединение

AND OR

Page 22: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Пример

OR

AND

dt_created >= ‘2016-01-15’ dt_created < ‘2016-03-01’ dt_created = ‘2016-04-01’

Page 23: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Пример

OR

AND

dt_created >= ‘2016-01-15’ dt_created < ‘2016-03-01’ dt_created = ‘2016-04-01’

T T T T

Page 24: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Пример

OR

AND

dt_created >= ‘2016-01-15’ dt_created < ‘2016-03-01’ dt_created = ‘2016-04-01’

T T T T T T F F

Page 25: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Пример

OR

AND

dt_created >= ‘2016-01-15’ dt_created < ‘2016-03-01’ dt_created = ‘2016-04-01’

T T T T T T F F F F F T

Page 26: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Пример

OR

AND

dt_created >= ‘2016-01-15’ dt_created < ‘2016-03-01’ dt_created = ‘2016-04-01’

T T T T T T F F F F F T

T T F F

Page 27: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Пример

OR

AND

dt_created >= ‘2016-01-15’ dt_created < ‘2016-03-01’ dt_created = ‘2016-04-01’

T T T T T T F F F F F T

T T F F

T T F T

Page 28: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

min 2016-01-01 2016-02-01 2016-03-01 2016-04-01

max 2016-02-01 2016-03-01 2016-04-01 2016-05-01

child orders_1 orders_2 orders_3 orders_4

Пример

OR

AND

dt_created >= ‘2016-01-15’ dt_created < ‘2016-03-01’ dt_created = ‘2016-04-01’

P T T T T T F F F F F P

P T F F

P T F P

Page 29: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

0 1 2 3

P T F P

Plan:

orders_4

dt_created >= ‘2016-01-15’ dt_created = ‘2016-04-01’full scan

orders_2orders_1

Page 30: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

HASH секционирование

OID Partitioning info

431287

431290

431295

431299partitioning type HASH

attribute city_id

attribute type integer

children ■■■■■■■■■

Page 31: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

HASH секционирование

partitioning type HASH

attribute city_id

attribute type integer

children ■■■■■■■■■

child orders_1 orders_2 orders_3 orders_4

Page 32: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Дерево выражений

OR

=

const: 5

SELECT * FROM orders WHERE city_id=5 OR city_id=10

=

const: 10var: city_idvar: city_id

Page 33: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Дерево выражений

OR

=

const: 5

SELECT * FROM orders WHERE city_id=5 OR city_id=10

=

const: 10var: city_idvar: city_id

Page 34: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Поиск HASH-секции

KEY OP CONST

OP это оператор равенства?

Вычислить hash от CONST

да нет

[hash; hash] [0; ∞)

hash — позиция в массиве children

Page 35: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Расширение pg_pathman

✓ Оптимизированный механизм построения планов для секционированных таблиц

✓ Функции для управления секциями ✓ Триггеры на вставку

Page 36: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Roadmap

‣ Оптимизация NestedLoop JOIN-ов ‣ LIST-секционирование ‣ HASH-секционирование по нецелочисленным атрибутам

Page 37: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Эксперимент для HASH

Время планирования в зависимости от количества секций в разбиении

Таблица: CREATE TABLE hash_test(id INTEGER);

Количество созданных секций: 2, 4, 8, 16, 32, 64, 128, 512, 1024, 2048

Количество запросов: 10000 на каждой конфигурации

EXPLAIN ANALYZE SELECT * FROM hash_testWHERE id = 10 AND (id%<N> = 10%<N>);(где <N> - количество секций)

Page 38: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Эксперимент для HASH

originalpathman

Page 39: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Эксперимент для RANGE

Время планирования в зависимости от количества секций в разбиении

Таблица: CREATE TABLE range_test(id INTEGER);

Количество созданных секций: 2, 4, 8, 16, 32, 64, 128, 512, 1024, 2048

Количество запросов: 10000 на каждой конфигурации

EXPLAIN ANALYZE SELECT * FROM range_testWHERE id = 10;

Page 40: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Эксперимент для RANGE

originalpathman

Page 41: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Эксперимент для RANGE

Время планирования в зависимости от количества секций в плане

Таблица: CREATE TABLE range_test(

id INTEGER,dt TIMESTAMP);

Количество созданных секций: 1095

Количество секций, попадающих в план: от 1 до 1095

Page 42: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

Эксперимент для RANGE

Page 43: "Секционирование без границ" Ильдар Мусин (Postgres Professional)

www.postgrespro.ru

Спасибо за внимание!

Контакты: [email protected] +7 929 929 6075

github.com/postgrespro/pg_pathman