PostgreSQL 11: Еволюція секціонування від Postgres 9.6 до Postgres 11

Відмінною всім п'ятниці! Дедалі менше часу залишається до запуску курсу «Реляційні СУБД»Тому сьогодні ділимося перекладом ще одного корисного матеріалу по темі.

В процесі розробки PostgreSQL 11 була проведена вражаюча робота щодо покращення секціонування таблиць. Секціонування таблиць - це функція, яка існувала в PostgreSQL досить довгий час, але її, якщо можна так висловитися, по суті не було до 10 версії, в якій вона стала дуже корисною функцією. Раніше ми заявляли, що успадкування таблиць - це наша реалізація секціонування, і це правда. Тільки цей спосіб змушував вас робити більшу частину роботи вручну. Наприклад, якщо ви хотіли, щоб кортежі вставлялися в секції під час INSERTів, ви мали налаштувати тригери робити це за вас. Секціонування за допомогою успадкування було дуже повільним та складним, щоб розробляти додаткові функції поверх нього.

У PostgreSQL 10 ми побачили народження «декларативного секціонування» - фічі, призначеної для вирішення багатьох проблем, які були нерозв'язні при використанні старого методу спадкування. Це призвело до появи набагато потужнішого інструменту, що дозволяє нам розділяти дані по горизонталі!

Порівняння фіч

У PostgreSQL 11 з'явився вражаючий набір нових фіч, які допомагають підвищити продуктивність та зробити секційовані таблиці прозорішими для додатків.

PostgreSQL 11: Еволюція секціонування від Postgres 9.6 до Postgres 11
PostgreSQL 11: Еволюція секціонування від Postgres 9.6 до Postgres 11
PostgreSQL 11: Еволюція секціонування від Postgres 9.6 до Postgres 11
1. Використовуючи обмежуючі винятки
2. Додає лише вузли
3. Тільки для секційованої таблиці, яка посилається на несекційовану
4. Індекси повинні містити всі ключові стовпці секції
5. Обмеження на секцію по обидва боки повинні збігатися

Продуктивність

Тут у нас також є добрі новини! Доданий новий метод видалення секцій. Цей новий алгоритм може визначати відповідні секції, переглядаючи умову запиту WHERE. Попередній алгоритм, у свою чергу, перевіряв кожну секцію, щоб визначити, чи вона може відповідати умові WHERE. Це призводило до додаткового збільшення часу планування зі збільшенням кількості секцій.

У 9.6, з секціонуванням за допомогою успадкування, маршрутизація кортежів у секції зазвичай виконувалася шляхом написання тригерної функції, яка містила серію операторів IF для вставки кортежу в правильну секцію. Ці функції були дуже повільними під час виконання. З декларативним секціонуванням, доданим до 10 версії, це стало працювати набагато швидше.

Використовуючи секційовану таблицю зі 100 секціями, ми можемо оцінити продуктивність завантаження 10 мільйонів рядків у таблицю з 1 стовпця BIGINT та 5 стовпців INT.

PostgreSQL 11: Еволюція секціонування від Postgres 9.6 до Postgres 11

Продуктивність запиту до цієї таблиці для пошуку одного індексованого запису та виконання DML для маніпулювання одним записом (використовуючи лише 1 процесор):

PostgreSQL 11: Еволюція секціонування від Postgres 9.6 до Postgres 11

Тут бачимо, що продуктивність кожної операції значно зросла після PG 9.6. Запити SELECT виглядають набагато краще, особливо ті, які можуть виключати безліч секцій під час планування запитів. Це означає, що планувальник може пропустити більшу частину роботи, яку він мав робити раніше. Наприклад, більше не будуються шляхи для непотрібних секцій.

Висновок

Секціонування таблиць починає ставати дуже потужною функцією в PostgreSQL. Воно дозволяє швидко виводити дані в online та переводити їх у offline, не чекаючи завершення повільних масивних операцій DML. Це також означає, що пов'язані дані можуть зберігатися разом, тобто до необхідних даних можна отримати доступ набагато ефективніше. Поліпшення, зроблені в цій версії, були б неможливими без розробників, ревьюєрів та комітерів, які невпинно працювали над усіма цими фічами.
Дякую їм усім! PostgreSQL 11 виглядає просто фантастично!

Ось така коротенька, але досить цікава стаття. Діліться коментарями, а також не забувайте записуватись на день відкритих дверей, у межах якого буде докладно викладено програму курсу.

Джерело: habr.com

Додати коментар або відгук