|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: Czy wiesz jak korzystać z narzędzia do partycjonowania pg_partman? |
| 4 | +description: "" |
| 5 | +date: 2024-02-17T08:00:00+01:00 |
| 6 | +published: true |
| 7 | +didyouknow: true |
| 8 | +lang: pl |
| 9 | +author: rmastalerek |
| 10 | +image: /assets/img/posts/2025-02-17-czy-wiesz-jak-korzystac-z-narzedzia-do-partycjonowania-pg-partman/thumbnail.webp |
| 11 | +tags: |
| 12 | +- databases |
| 13 | +--- |
| 14 | + |
| 15 | +We wpisie [Czy wiesz czym jest partycjonowanie?]({% post_url pl/2025-01-06-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. |
| 16 | + |
| 17 | +### Korzyści z używania pg_partman |
| 18 | +- Automatyczne tworzenie, rotacja i usuwanie partycji |
| 19 | +- Wsparcie dla różnych metod partycjonowania (zakresowe i listowe) |
| 20 | +- Możliwość dostosowania zachowania `pg_partman` do specyficznych potrzeb aplikacji |
| 21 | + |
| 22 | +### Instalacja |
| 23 | +```sql |
| 24 | +CREATE EXTENSION pg_partman; |
| 25 | +``` |
| 26 | +- Wykonanie tego polecenia powoduje instalację rozszerzenia `pg_partman` w bazie danych, jeśli to nie zostało wcześniej w tej bazie dodane. |
| 27 | +PostgreSQL tworzy odpowiednie wpisy w katalogach systemowych (np. `pg_extension`). |
| 28 | +- 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`). |
| 29 | +- 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`. |
| 30 | + |
| 31 | +### Utworzenie tabeli i konfiguracja do partycjonowania |
| 32 | +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. |
| 33 | + |
| 34 | +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. |
| 35 | + |
| 36 | +**Zalety:** |
| 37 | +- Dzięki podziałowi tabeli na partycje (np. miesięczne, dzienne, itp.), zapytania mogą być kierowane tylko do wybranych partycji zamiast całej tabeli. |
| 38 | +- 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 |
| 39 | +- Możliwe jest archiwizowanie starych partycji na innych nośnikach |
| 40 | +- Partycjonowanie ułatwia reorganizację danych, np. odtworzenie partycji po awarii |
| 41 | + |
| 42 | +```sql |
| 43 | +CREATE TABLE public_logs ( |
| 44 | + id serial PRIMARY KEY, |
| 45 | + log_date timestamptz NOT NULL, |
| 46 | + log_level text NOT NULL, |
| 47 | + message text |
| 48 | +) PARTITION BY RANGE (log_date); |
| 49 | +``` |
| 50 | + |
| 51 | +Wykonanie powyższego polecenia spowoduje: |
| 52 | +- 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. |
| 53 | +- 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.). |
| 54 | + |
| 55 | +### Konfiguracja pg_partman do zarządzania partycjami |
| 56 | +```sql |
| 57 | +SELECT partman.create_parent('public_logs', 'log_date', 'monthly'); |
| 58 | +``` |
| 59 | +Wykonanie powyższego polecenia spowoduje: |
| 60 | +- Oznaczenie tabeli `public_logs` jako tabeli nadrzędnej dla partycjonowania zarządzanego przez `pg_partman`. |
| 61 | +- Automatyczne utworzenie metody partycjonowania (`RANGE` na podstawie kolumny `log_date`) |
| 62 | +- Utworzenie pierwszych partycji zgodnie z określonym interwałem (`monthly`) |
| 63 | +- Zarejestrowanie tabeli w konfiguracji `pg_partman`, aby była zarządzana automatycznie |
| 64 | + |
| 65 | +### Automatyczne tworzenie partycji |
| 66 | +`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. |
| 67 | +```sql |
| 68 | +SELECT partman.run_maintenance('public_logs'); |
| 69 | +``` |
| 70 | + |
| 71 | +### Przykładowe zapytania |
| 72 | +```sql |
| 73 | +-- Wstawianie danych |
| 74 | +INSERT INTO public_logs (log_date, log_level, message) |
| 75 | +VALUES (NOW(), 'INFO', 'System started'); |
| 76 | + |
| 77 | +-- Zapytanie do partycji |
| 78 | +SELECT * FROM public_logs WHERE log_date BETWEEN '2023-01-01' AND '2023-01-31'; |
| 79 | +``` |
| 80 | + |
| 81 | +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. |
| 82 | + |
| 83 | +### Alternatywy |
| 84 | +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 |
| 85 | +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 |
| 86 | +3. `pg_slice` - alternatywne rozszerzenie do zarządzania partycjami, bardziej elastyczne dla specyficznych scenariuszy |
| 87 | + |
| 88 | +### Podsumowanie |
| 89 | +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. |
| 90 | + |
| 91 | +### Dokumentacja |
| 92 | +https://github.com/pgpartman/pg_partman |
0 commit comments