Skip to content

Commit 5a78090

Browse files
[2024-02-17] Czy wiesz jak korzystać z narzędzia do partycjonowania pg_partman? (#264)
--------- Co-authored-by: Robert Mastalerek <rmastalerek@consdata.com>
1 parent 9d81302 commit 5a78090

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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
106 KB
Loading

0 commit comments

Comments
 (0)