Po roku prac rozwojowych opublikowano nową stabilną wersję systemu zarządzania bazą danych PostgreSQL 18. Aktualizacje dla nowej wersji będą wydawane przez pięć lat, do listopada 2030 roku. Wsparcie dla PostgreSQL 13.x, najstarszej z obsługiwanych wersji, zostanie zakończone 13 listopada.
Główne nowości:
- Dodano podsystem asynchronicznego wejścia/wyjścia, który pozwala zwiększyć przepustowość wejścia/wyjścia i wyeliminować opóźnienia. Oprócz uniwersalnej implementacji AIO (io_method=worker), dostępnej na wszystkich platformach, opartej na wykonywaniu kilku procesów obsługujących (domyślnie 3), w systemie Linux może być stosowany interfejs asynchronicznego wejścia/wyjścia io_uring (io_method=io_uring), wspierany od jądra Linux 5.1. Asynchroniczne wejście/wyjście jest obecnie wykorzystywane tylko do przyspieszania wykonywania niektórych operacji związanych z odczytem danych z systemu plików, takich jak sekwencyjne przeszukiwanie, skanowanie bitowej mapy indeksów i przeprowadzanie czyszczenia (vacuum). W niektórych testach zastosowanie AIO prowadzi do zwiększenia wydajności od 2 do 3 razy. Operacje zapisu wciąż są wykonywane w trybie synchronicznym, aby spełnić wymagania ACID.
- Wdrożono optymalizację „skip scan” w indeksach wielokolumnowych, dzięki której indeks może być używany nie tylko do sprawdzania pierwszej zaindeksowanej kolumny oraz pełnego powiązania kolumn, ale także do osobnego przetwarzania pozostałych zaindeksowanych kolumn. Na przykład wcześniej, przy tworzeniu indeksu B-drzewowego nad kolumnami „(status, date)”, indeks był stosowany tylko do zapytań sprawdzających pole „status” lub oba pola „status” i „date”, a przy sprawdzaniu w zapytaniu tylko pola „date” wykonywano skanowanie zawartości tabeli. Tryb „skip scan” pozwala w określonych sytuacjach skanować indeks przy zapytaniu tylko o pole „date”. Tryb ten stosuje się tylko do indeksów „B-tree” przy użyciu w zapytaniu operatora warunkowego „=” nad polem zaindeksowanym, w sytuacjach, gdy pominięte pole ma niewielką liczbę różnych wartości (na przykład optymalizacja zadziała, jeśli pole status „status” ma kilka ustalonych wartości).
- Dodano optymalizacje, które efektywniej wykorzystują indeksy dla zapytań zawierających konstrukcje „OR” oraz „IN (…)” w bloku „WHERE”, a także poprawiają wydajność planowania i wykonywania łączenia tabel (na przykład przyspieszony kod łączenia hash oraz wprowadzono możliwość użycia inkrementalnego sortowania podczas łączenia tabel).
- Dodano wsparcie dla równoległego budowania indeksów GIN (Generalized Inverted Index), stosowanych do indeksowania wartości złożonych, takich jak tablice oraz organizacji wyszukiwania w pełnotekstowych danych lub strukturach JSON.
- Dodano możliwość tworzenia materializowanych widoków oraz kluczy dla partycjonowanych tabel z indeksami o znaku „unikalnym”, które nie wykorzystują struktury B-drzewa.
- Podniesiono ogólną wydajność blokad dla zapytań działających na wielu tabelach, a także wprowadzono usprawnienia w obsłudze zapytań do tabel partycjonowanych, przyspieszające filtrację nieużywanych sekcji oraz operacje łączenia (JOIN).
- Przyspieszono operacje na tekstach, takie jak funkcje zmiany do wielkich/małych liter. Dodano tryb PG_UNICODE_FAST dla przyspieszenia uwzględniania właściwości lokalizacji znaków Unicode.
- Wprowadzono możliwość zapisywania statystyk planisty zapytań po aktualizacji między znacznymi wersjami PostgreSQL. Zmiana ta pozwala uniknąć wykonania zasobożernej operacji „ANALYZE” po uruchomieniu nowej wersji, przed zakończeniem której możliwe jest spadek wydajności DBMS.
- Zwiększono wydajność narzędzia pg_upgrade, stosowanego do automatyzacji przejścia na nową, znaczną wersję PostgreSQL. Optymalizacje są szczególnie widoczne podczas aktualizacji baz danych zawierających dużą liczbę obiektów, takich jak tabele i sekwencje. W celu przyspieszenia działania pg_upgrade dodano również flagę „—jobs N” do równoległego przeprowadzania kontroli w N wątkach oraz flagę „—swap” do wymiany katalogów z danymi w całości bez używania odniesień, bez klonowania i bez kopiowania plików.
- Dodano wsparcie dla wirtualnych kolumn generowanych, których wartość jest obliczana dynamicznie w trakcie wykonywania zapytań, bez zapisywania na dysku. Jeśli w wyrażeniu „CREATE TABLE…” dla kolumn generowanych podano jedynie słowo kluczowe „GENERATED” bez określenia typu (STORED lub VIRTUAL), ta nowa opcja jest stosowana domyślnie zamiast starej implementacji. W starej wersji wartości były generowane podczas wykonywania operacji „INSERT” lub „UPDATE” i zapisywane na dysku do późniejszego wykorzystania. Wadą wirtualnych kolumn generowanych jest niemożność używania ich w indeksach, a zaletą — możliwość normalizacji i zmiany danych w locie (istotne przy pracy z danymi JSON). Jeśli chodzi o klasyczne kolumny generowane przechowywane, to w nowym wydaniu zapewniono dla nich wsparcie dla replikacji logicznej.
- W poleceniach INSERT, UPDATE, DELETE i MERGE wprowadzono możliwość zwracania wcześniejszych (OLD) i bieżących (CURRENT) wartości w wyrażeniu RETURNING. Na przykład, „UPDATE… RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*”.
- Dodano funkcję uuidv7() do generowania losowych unikalnych identyfikatorów w formacie UUIDv7. W przeciwieństwie do starej funkcji do generowania UUID (gen_random_uuid), która jest teraz dodatkowo dostępna pod nazwą uuidv4(), UUIDv7 uwzględnia czas generacji oprócz losowej wartości. Obecność uporządkowanych części w wartości UUID (pierwsze 12 znaków — czas epoch, a następne 18 — wartość losowa) zwiększa efektywność sortowania i indeksowania, co jest istotne, ponieważ UUID zazwyczaj używane są jako klucze główne (na przykład klucze tworzone w bliskim czasie są rozmieszczane blisko siebie w indeksie).
- W operacji „LIKE” wprowadzono wsparcie dla porównań tekstowych, w których używane są niedeterministyczne właściwości lokalizacji „collation”, umożliwiające porównania z uwzględnieniem znaczenia znaków (na przykład przy porównywaniu może nie być brany pod uwagę znak akcentu). Dodano funkcję CASEFOLD do zmiany rejestru znaków z uwzględnieniem właściwości lokalnych „collation” (na przykład niektóre znaki mają więcej niż dwie małe wersje lub przy porównywaniu wymagają konwersji na wielką literę, a nie na małą).
- Dodano możliwość stosowania ograniczeń czasowych (temporal constraint). Wartości «PRIMARY KEY» i «UNIQUE» przy dodawaniu ograniczeń czasowych powinny używać wyrażenia «WITHOUT OVERLAPS», a w przypadku «FOREIGN KEY» – wyrażenia PERIOD. Na przykład, przy definiowaniu kluczy podstawowych można ograniczyć klucze z nachodzącymi na siebie przedziałami czasowymi.
- Dodano polecenie «CREATE FOREIGN TABLE … LIKE command» do tworzenia schematu tabeli zdalnej na podstawie definicji lokalnej tabeli.
- Dodano wsparcie dla połączeń z DBMS z wykorzystaniem uwierzytelniania opartego na OAUTH 2.0 przy użyciu tokena dostępu zamiast hasła. Korzystanie z OAUTH pozwala nie przechowywać haseł w DB, zidentyfikować użytkowników przez zewnętrzne usługi oraz korzystać z takich możliwości jak uwierzytelnianie dwuskładnikowe i jednolity punkt dostępu (SSO).
- Dodano funkcję ssl_tls13_ciphers(), która pozwala określić listę dozwolonych algorytmów szyfrowania przy połączeniu z użyciem protokołu TLSv1.3.
- Wsparcie dla uwierzytelniania z użyciem algorytmu md5 do haszowania haseł zostało przeniesione do kategorii przestarzałych i planowanych do usunięcia. Zamiast md5 zaleca się stosowanie algorytmu SCRAM (SCRAM-SHA-256), który pojawił się w PostgreSQL 10. Dodatkowo zaznacza się realizację wsparcia dla przekazywania uwierzytelniania opartego na SCRAM przy połączeniach przez postgres_fdw i dblink z zewnętrznymi serwerami PostgreSQL.
- Podczas wykonywania operacji «EXPLAIN ANALYZE» zapewniono wyjście zawierające informacje o liczbie operacji wyszukiwania w indeksach podczas skanowania indeksu oraz liczbie odwołań do buforów przy wykonywaniu zapytania. Do wyniku «EXPLAIN ANALYZE VERBOSE» dodano statystyki dotyczące CPU, dziennika WAL oraz intensywności operacji odczytu. Do tabeli pg_stat_all_tables dodano informacje o czasie poświęconym na operacje VACUUM i analizy tabel. Udostępniono statystyki dotyczące intensywności wejścia/wyjścia oraz obciążenia dziennika WAL w podziale na poszczególne połączenia. W pg_stat_subscription_stats i logach dodano informacje diagnostyczne dotyczące konfliktów podczas wykonywania operacji zapisu w czasie replikacji logicznej.
- W nowych instalacjach domyślnie włączono stosowanie sum kontrolnych do weryfikacji integralności przechowywanych danych. Aby anulować to zachowanie podczas uruchamiania initdb, należy podać opcję «—no-data-checksums».
- Do narzędzia pg_createsubscriber dodano flagę „—all”, która umożliwia utworzenie logicznych replik jednym poleceniem dla wszystkich baz danych.
- Zrealizowano nową wersję (3.2) protokołu stosowanego do komunikacji zewnętrznych narzędzi z DBMS, zaimplementowanego w bibliotece libpq. Ostatnia aktualizacja protokołu miała miejsce w PostgreSQL 7.4 (2003 rok). W bibliotece libpq domyślnie wciąż używana jest wersja 3.0.
Źródło: opennet.ru
