consdata.com
Blog techniczny Blog biznesowy Dział HR
EN
databases

Czy wiesz jak korzystać z narzędzia do partycjonowania pg_partman?

author Robert Mastalerek
17 lutego 2025

We wpisie Czy wiesz czym jest partycjonowanie? dowiedzieliśmy się już czym jest partycjonowanie, do czego służy i jak może ułatwić pracę. W tym wpisie poznamy narzędzie, które upraszcza nam tworzenie i zarządzanie partycjami w PostgreSQL o nazwie PostgreSQL Partition Manager (pg_partman). W skrócie PostgreSQL Partition Manager to rozszerzenie dla PostgreSQL, które automatyzuje proces zarządzania partycjami w bazie danych.

Korzyści z używania pg_partman

  • Automatyczne tworzenie, rotacja i usuwanie partycji
  • Wsparcie dla różnych metod partycjonowania (zakresowe i listowe)
  • Możliwość dostosowania zachowania pg_partman do specyficznych potrzeb aplikacji

Instalacja

CREATE EXTENSION pg_partman;
  • Wykonanie tego polecenia powoduje instalację rozszerzenia pg_partman w bazie danych, jeśli to nie zostało wcześniej w tej bazie dodane. PostgreSQL tworzy odpowiednie wpisy w katalogach systemowych (np. pg_extension).
  • Następnie, PostgreSQL tworzy zestaw funkcji, procedur, widoków, tabel i innych obiektów potrzebnych do działania rozszerzenia. Wszystkie te obiekty są instalowane w schemacie, w którym uruchomiono polecenie (zazwyczaj public).
  • Instalowana jest domyślna wersja rozszerzenia, która znajduje się w katalogu rozszerzeń PostgreSQL (pliki .control i .sql). Jeżeli później zajdzie potrzeba, można zaktualizować rozszerzenie za pomocą polecenia ALTER EXTENSION ... UPDATE.

Utworzenie tabeli i konfiguracja do partycjonowania

Wyobraźmy sobie tabelę public_logs, która służyć będzie do przechowywania logów systemowych lub logów z aplikacji. Tabela będzie potrzebna do monitorowania działania aplikacji, generowania raportów o wydajności i problemach, itp.

Logi są zazwyczaj generowane w bardzo dużej ilości, szczególnie w aplikacjach o dużym ruchu. Bez odpowiedniej optymalizacji, zapytania do tabeli z milionami lub miliardami wierszy mogą stać się mało wydajne. Partycjonowanie pomaga rozwiązać ten problem.

Zalety:

  • Dzięki podziałowi tabeli na partycje (np. miesięczne, dzienne, itp.), zapytania mogą być kierowane tylko do wybranych partycji zamiast całej tabeli.
  • Logi starsze niż określony okres (np. 3 miesiące) mogą być łatwo usuwane przez usunięcie całej partycji, zamiast kasowania poszczególnych wierszy
  • Możliwe jest archiwizowanie starych partycji na innych nośnikach
  • Partycjonowanie ułatwia reorganizację danych, np. odtworzenie partycji po awarii
CREATE TABLE public_logs (
    id serial PRIMARY KEY,
    log_date timestamptz NOT NULL,
    log_level text NOT NULL,
    message text
) PARTITION BY RANGE (log_date);

Wykonanie powyższego polecenia spowoduje:

  • Utworzenie przez PostgreSQL nadrzędnej tabeli public_logs (partitioned_table), która ma strukturę określoną w poleceniu. W odróżnieniu od zwykłych tabel, tabela nadrzędna nie przechowuje danych. Jest tylko szablonem, który pozwala na logiczne grupowanie partycji.
  • Określenie metody partycjonowania: w tym przypadku PARTITION BY RANGE (log_date). Oznacza to, że dane w tej tabeli będą przechowywane w partycjach na podstawie wartości kolumny log_date. Każda partycja natomiast będzie odpowiadała pewnemu zakresowi wartości (np. tygodniowi, miesiącowi, itd.).

Konfiguracja pg_partman do zarządzania partycjami

SELECT partman.create_parent('public_logs', 'log_date', 'monthly');

Wykonanie powyższego polecenia spowoduje:

  • Oznaczenie tabeli public_logs jako tabeli nadrzędnej dla partycjonowania zarządzanego przez pg_partman.
  • Automatyczne utworzenie metody partycjonowania (RANGE na podstawie kolumny log_date)
  • Utworzenie pierwszych partycji zgodnie z określonym interwałem (monthly)
  • Zarejestrowanie tabeli w konfiguracji pg_partman, aby była zarządzana automatycznie

Automatyczne tworzenie partycji

pg_partman umożliwia automatyczne tworzenie nowych partycji na podstawie harmonogramu. Aby wykonać taką partycję wystarczy wykonać poniższe polecenie. Można wykonać je również w zadaniu cron, aby regularnie tworzyć nowe partycje i usuwać stare.

SELECT partman.run_maintenance('public_logs');

Przykładowe zapytania

-- Wstawianie danych
INSERT INTO public_logs (log_date, log_level, message) 
VALUES (NOW(), 'INFO', 'System started');

-- Zapytanie do partycji
SELECT * FROM public_logs WHERE log_date BETWEEN '2023-01-01' AND '2023-01-31';

Po wykonaniu operacji INSERT PostgreSQL automatycznie przypisuje dane do odpowiedniej partycji na podstawie wartości kolumny partycjonującej, np. daty w przypadku partycjonowania zakresowego. pg_partman nie ingeruje bezpośrednio w proces INSERT, ale zapewnia, że odpowiednie partycje są dostępne w momencie wstawiania danych.

Alternatywy

  1. Native PostgreSQL Partitioning - PostgreSQL od wersji 10 ma wbudowane wsparcie dla partycjonowania, które może być wystarczające dla prostszych przypadków użycia
  2. pg_cron - umożliwia zarządzanie harmonogramem zadań bezpośrednio w PostgreSQL, co może być używane w połączeniu z natywnym partycjonowaniem
  3. pg_slice - alternatywne rozszerzenie do zarządzania partycjami, bardziej elastyczne dla specyficznych scenariuszy

Podsumowanie

PostgreSQL Partition Manager (pg_partman) to potężne narzędzie do zarządzania partycjami w dużych tabelach. Dzięki automatyzacji i elastyczności pozwala na efektywne zarządzanie danymi, poprawiając wydajność systemu. Warto rozważyć je tam, gdzie wydajność i skalowalność są kluczowe, zwłaszcza w porównaniu z natywnymi rozwiązaniami PostgreSQL i innymi narzędziami dostępnymi na rynku.

Dokumentacja

https://github.com/pgpartman/pg_partman

Najnowsze wpisy

  • Dostępność w PDF - dokumenty bez barier
  • Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?
  • Czy wiesz, że w Angular 17 została wprowadzona alternatywa dla *ngSwitch?
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

newsletter

techniczny

Zapisz się

Podobne wpisy

post-image
WCAG

Dostępność w PDF - dokumenty bez barier

author
Kacper Hoffman 28 kwi 2025
post-image
angular

Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?

author
Piotr Tatarski 7 kwi 2025
post-image
angular

Czy wiesz, że w Angular 17 została wprowadzona alternatywa dla *ngSwitch?

author
Dorian Mejer 10 mar 2025
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

Zapisz się na

newsletter

techniczny

consdata.com
  • Kontakt

    • sales@consdata.com
    • +48 61 41 51 000

  • Biuro

    • K9Office
      Krysiewicza 9/14
      61-825 Poznań
      Polska

  • Rozwiązania

    • Eximee
    • Kouncil
  • Blog Dołącz do nas
Copyright © 2024 Consdata. All rights reserved. Privacy Policy & Cookies
Chcemy używać plików cookie oraz skryptów podmiotów trzecich do polepszania funkcjonowania tej strony Zgadzam się