Partycjonowanie zakresowe, listowe i haszujące
Wybierać właściwą strategię partycjonowania: zakresowe dla szeregów czasowych, listowe dla dzierżawców i haszujące dla równomiernego rozkładu
Partycjonowanie zakresowe, listowe i haszujące to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Partycjonowanie zakresów
Każda partycja obejmuje ciągły zakres wartości. Najczęściej stosuje się je w przypadku szeregów czasowych:
CREATE TABLE events (
id BIGSERIAL,
ts TIMESTAMPTZ NOT NULL,
data JSONB
) PARTITION BY RANGE (ts);
CREATE TABLE events_2024_q1 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE events_2024_q2 PARTITION OF events
FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');Granice zakresu są półotwarte
FROM jest włączne, a TO wyłączne. Granice układają się bez nakładania i bez luk.
Partycjonowanie list
Każda partycja przechowuje określone wartości:
CREATE TABLE customers (
id BIGSERIAL,
country TEXT NOT NULL,
name TEXT
) PARTITION BY LIST (country);
CREATE TABLE customers_us PARTITION OF customers FOR VALUES IN ('US');
CREATE TABLE customers_eu PARTITION OF customers FOR VALUES IN ('DE','FR','IT','ES','NL');
CREATE TABLE customers_other PARTITION OF customers DEFAULT;Partycja DEFAULT
Przechowuje wiersze, które nie pasują do żadnej innej partycji. Bez niej operacje INSERT dla niepasujących wierszy kończą się błędem.
Partycjonowanie haszujące
Wiersze są rozdzielane na podstawie haszowania klucza partycjonowania. Jest to dobre rozwiązanie, gdy potrzebny jest równomierny rozkład, ale nie ma naturalnego podziału na zakresy ani listy:
CREATE TABLE sessions (
id UUID,
user_id BIGINT,
data JSONB
) PARTITION BY HASH (user_id);
CREATE TABLE sessions_0 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE sessions_1 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE sessions_2 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE sessions_3 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 3);Wybór strategii
- Range — szeregi czasowe i rosnące monotonicznie identyfikatory
- List — dzierżawcy, kraje i warstwy o wysokiej aktywności
- Hash — gdy nie ma naturalnego rozkładu, a potrzebna jest tylko równoległość
Podpartycjonowanie
Partycje mogą same być partycjonowane (wielopoziomowo):
CREATE TABLE events_2024 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
PARTITION BY HASH (user_id);
-- 2024 is a yearly range partition, internally hashed by user_id.Indeksy na tabelach partycjonowanych
Indeksy utworzone na tabeli nadrzędnej są automatycznie propagowane do wszystkich partycji. Ograniczenia UNIQUE muszą zawierać klucz partycjonowania:
CREATE INDEX events_user_idx ON events (user_id);
-- Creates one index per partition automatically.
ALTER TABLE events ADD CONSTRAINT events_uniq UNIQUE (id, ts);
-- ts must be in the constraint because it's the partition key.Klucze główne a partycje
PRIMARY KEY tabeli partycjonowanej musi zawierać kolumnę partycjonowania. Jest to fundamentalne ograniczenie partycjonowania deklaratywnego.
Dodawanie i usuwanie partycji
Niedrogie operacje:
CREATE TABLE events_2024_q3 PARTITION OF events
FOR VALUES FROM ('2024-07-01') TO ('2024-10-01');
DROP TABLE events_2023_q1;
-- Instant; equivalent to deleting all old data.Automatyczne tworzenie partycji
Postgres nie tworzy automatycznie przyszłych partycji. Typowe rozwiązania:
- rozszerzenie pg_partman — zarządzane partycje miesięczne
- zaplanowane zadanie tworzące kolejną partycję za pomocą CREATE
Klucze obce
Klucze obce wskazujące na tabelę partycjonowaną wymagają PG 12+. Klucze obce z tabeli partycjonowanej do zwykłej tabeli działają normalnie.
Podsumowanie
Trzy strategie partycjonowania obejmują większość przypadków.
- Range dla danych czasowych i sekwencyjnych
- List dla dyskretnych zbiorów
- Hash dla równomiernego rozkładu
- PRIMARY KEY musi zawierać kolumnę partycjonowania
Szybkie sprawdzenie
Chce Pan/Pani podzielić tabelę sessions według user_id, zapewniając równomierny rozkład i brak naturalnego porządku. Którą strategię należy wybrać?
Często zadawane pytania
Czy lekcja „Partycjonowanie zakresowe, listowe i haszujące” jest bezpłatna?
Tak — pełny tekst „Partycjonowanie zakresowe, listowe i haszujące” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Partycjonowanie zakresowe, listowe i haszujące”?
Wybierać właściwą strategię partycjonowania: zakresowe dla szeregów czasowych, listowe dla dzierżawców i haszujące dla równomiernego rozkładu Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Partycjonowanie zakresowe, listowe i haszujące”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego partycjonować: przycinanie i konserwacja
- Partycjonowanie zakresowe, listowe i haszujące
- Odłączanie i dołączanie partycji
- Wydajne wykonywanie zapytań obejmujących partycje