EuroLinux PostgreSQL 14 lista zmian

PostgreSQL 14 pod lupą – szczegółowa lista zmian

Przygotowaliśmy najobszerniejsze w całej sieci w języku polskim zestawienie zmian i nowych funkcjonalności w PostgreSQL 14. Jest to system do zarządzania obiektowo-relacyjnymi bazami danych. Mając za sobą ponad dwie dekady rozwoju, Postgres jest obecnie najbardziej zaawansowaną bazą danych typu Open Source, dostępną w każdym miejscu na świecie.

30 września 2021 roku została wydana najnowsza wersja PostgreSQL 14. Fani Postgresa mieli więc okazję do świętowania przez cały tydzień, gdyż 6 dni wcześniej miała miejsce pierwsza rocznica wydania wersji 13. Jest to zatem doskonała chwila, aby spojrzeć na zmiany, które twórcy topowego silnika bazodanowego przygotowali w bieżącej wersji. Słowem wstępu, wyjaśnijmy najpierw, czym jest PostgreSQL i jakie ma on znaczenie na obecnym rynku.

PostgreSQL to system do zarządzania obiektowo-relacyjnymi bazami danych, opracowany na Wydziale Informatyki Uniwersytetu Kalifornijskiego w Berkeley. Mając za sobą ponad dwie dekady rozwoju, PostgreSQL jest obecnie najbardziej zaawansowaną bazą danych typu Open Source, dostępną w każdym miejscu na świecie.

Krótka historia powstania

Projekt POSTGRES, prowadzony przez profesora Michaela Stonebrakera, był sponsorowany między innymi przez Agencję Zaawansowanych Projektów Badawczych w Obszarze Obronności – Defense Advanced Research Projects Agency (DARPA). Wdrażanie POSTGRESa rozpoczęło się w 1986 roku, a pierwsza działająca wersja demonstracyjna była już w roku 1987.

W 1994 roku Andrew Yu i Jolly Chen dodali do POSTGRESa interpreter języka SQL. Pod nową nazwą Postgres95 został udostępniony w sieci jako Open Source’owy potomek oryginalnego kodu POSTGRESa z Berkeley. Co ciekawe, kod Postgres95 był napisany całkowicie w standardzie ANSI C, został skrócony o 25%, a jego działanie było zaskakująco szybkie, bo aż około 30-50% szybsze w porównaniu z POSTGRES.

Na początku roku 1996 stało się jasne, że nazwa „Postgres95” nie przetrwa próby czasu, gdyż z roku na rok będzie się wydawała coraz bardziej przestarzała. Wybrano więc nową nazwę – PostgreSQL. Nazwa ta powstała, aby odzwierciedlić związek między oryginalnym POSTGRESem a nowszymi wersjami z SQL. Jako ciekawostkę warto dopowiedzieć, że twórcy rozpoczęli numerację od 6.0, umieszczając w poprzednich wersjach wcześniejsze wydania Postgres95, a w wersji pierwszej oryginalny projekt POSTGRESa z Berkeley.

Postgres czy PostgreSQL?

Wiele osób nadal określa PostgreSQL jako „Postgres” (teraz rzadko pisany wielkimi literami) ze względu na tradycję lub łatwiejszą wymowę. Użycie tej nazwy jest powszechnie akceptowane jako pseudonim lub alias.

PostgreSQL a pozycja na rynku

Według serwisu Google Trends popularność PostgreSQL (kolor niebieski) nieustannie rośnie. Mocno zwiększa się również jego przewaga względem innych znanych systemów zarządzania bazami danych, takich jak Oracle DB (kolor czerwony) czy MongoDB (kolor żółty).

EuroLinux PostgreSQL wykresWykres przedstawia zainteresowanie w czasie. Szczyt popularności frazy w wyszukiwaniach Google oznaczony został jako wartość 100. Wartość 50 oznacza że fraza była dwa razy mniej popularna.

EuroLinux PostgreSQL mapa

Mapa obrazuje popularność PostgreSQL (niebieski), Oracle DB (czerwony), MongoDB (żółty) na przestrzeni ostatnich 10 lat. Im ciemniejszy jest kolor tym większą ma przewagę w danym regionie. Kolor szary oznacza brak danych.

PostgreSQL 14 a PostgreSQL 13

Wersja 14 relacyjnej bazy danych PostgreSQL została wydana 30 września 2021 roku i posiada szereg nowości względem swojej poprzedniczki. Twórcy w najnowszej wersji Postgresa zauważalnie pochylili się nad względem wydajności bazy danych, nowym sposobem replikacji czy też trybem awaryjnym dla garbage-collectora. Są to jedynie przykłady nowych funkcjonalności, które znajdziemy w najnowszej wersji PostgreSQL 14. Obszerna lista wszystkich zmian dostępna jest poniżej.

Szczegółowa lista nowych funkcjonalności i zmian w PostgreSQL 14

Poniższa lista została podzielona na następujące kategorie tematyczne: Serwer, Replikacja strumieniowa i przywracanie, Klauzule SELECT i INSERT, Polecenia użytkowe, Typy danych, Funkcje, PL/PgSQL, Interfejs klienta, Aplikacje klienckie, Aplikacje serwera, Dokumentacja, Kod źródłowy oraz Dodatkowe moduły. Lista opisuje wszelkie zmiany w PostgreSQL 14 w stosunku do poprzedniego głównego wydania Postgresa.

Serwer

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano predefiniowane role pg_read_al_data i pg_write_al_data Role te mogą być użyte, aby zapewnić prawa odczytu i zapisu do wszystkich tabel, widoków i sekwencji bez konieczności logowania Stephen Frost
Dodano predefiniowaną rolę pg_database_owner, która określa właściciela bazy danych Jest to niezwykle przydatne do wykorzystania w template databases Noah Misch
Usunięto pliki temporalne po błędzie krytycznym Wcześniej pliki te zostawały w celach debugowania. W razie potrzeby funkcję tę można kontrolować nowym parametrem serwera remove_temp_files_after_crash Euler Taveira
Dodano możliwość przerwania długo działających zapytań, gdy następuje rozłączenie klienta Parametr serwera client_conection_check_interval pozwala kontrolować, czy utrata połączenia jest sprawdzana (wspierane na systemie Linux i kilku innych) Sergey Cherkashin, Thomas Munro
Dodano opcjonalny timeout pg_terminate_backend()
Zezwolono, aby szerokie krotki były dodawane do prawie pustych stron stosu Poprzednio krotki, których dodanie przekraczało współczynnik zajętości strony, były dodawane do nowych stron John Naylor, Floris van Ne
Dodano Server Name Indication (SNI) w pakietach połączenia SL Można to zablokować za pomocą opcji slsni Peter Eisentraut

Serwer – vacuum

Vacuum to inna nazwa na Garbage-Collector, czyli narzędzie do zbierania i usuwania niepotrzebnych rzeczy (tak zwanych śmieci) z bazy danych np. martwych krotek.

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano możliwość pomijania przez vacuum czyszczenia indeksów, gdy liczba usuwalnych wpisów indeksów nie jest znacząca Parametr INDEX_CLEANUP ma nową wartość domyślną auto, która zezwala na tę optymalizację Masahiko Sawada, Peter Geoghegan
Umożliwiono bezpośrednie (bez wcześniejszego zaznaczenia, że strona jest usunięta) dodawanie przez vacuum usuniętych stron btre do mapy wolnego miejsca Wcześniej vacuum mógł dodawać do mapy wolnego miejsca jedynie te strony, które uprzednio były zaznaczone jako usunięte Peter Geoghegan
Dodano możliwość odzyskiwania przez vacuum miejsca użytego przez nieużywane wskaźniki stosu Mathias van de Ment, Peter Geoghegan
Umożliwiono stosowanie przez vacuum bardziej agresywnej taktyki usuwania martwych rzędów podczas operacji indeksowania z minimalną blokadą CREATE INDEX CONCURENTLY i REINDEX CONCURENTLY nie są ograniczone przez usuwanie martwych rzędów innych relacji Álvaro Herera
Przyspieszono metody czyszczenia bazy danych z wieloma relacjami Tatsuhito Kasahara
Usunięto wartości domyślne parametru vacuum_cost_page_mis, aby lepiej odzwierciedlić obecne możliwości sprzętowe Peter Geoghega
Dodano możliwości pominięcia czyszczenia tabel TOAST Aktualnie VACUUM posiada opcję PROCES_TOAST, która ustawiona na false wyłącza czyszczenie tablicy TOAST. Dodatkowo do vacuumdb dodano opcję no-proces-toast Nathan Bosart
Poprawiono aktualizację bitów widoczności strony dla COPY FREZE Anastasia Lubenikova, Pavan Deolase, Jef Janes
Umożliwiono operacjom czyszczącym bardziej agresywną taktykę, gdy tabela jest bliska zdarzenia xid lub multixact wraparound Jest to kontrolowane przez vacuum_failsafe_age u vacuum_multixact_failsafe_age Masahiko Sawada, Peter Geoghegan
Zwiększono czas ostrzeżenia i limit przed zdarzeniem transaction id i multi-transaction wraparound To powinno zredukować prawdopodobieństwo wystąpienia błędu bez żadnych ostrzeżeń odnośnie zdarzenia wraparound Noah Misch
Dodano informacje per-index do logów autovacuum Masahiko Sawada

Serwer – partycjonowanie

Zmiana Dodatkowe informacje Autor/Autorzy
Poprawiono wydajność aktualizowania i usuwania partycjonowanej tablicy z wieloma partycjami Ta zmiana znacząco redukuje obciążenie planisty, a także umożliwia aktualizację/usuwanie partycjonowanych tabel z użyciem execution-time partition pruning Amit Langote, Tom Lane
Dodano możliwość odłączania partycji w sposób nieblokujący Składnia to ALTER TABLE … DETACH PARTITION … CONCURRENTLY i FINALIZE Álvaro Herrera
Umożliwiono zignorowanie klauzuli COLLATE w wartościach granicznych partycjonowania Poprzednio takie klauzule musiały pasować do klucza partycji Tom Lane

Serwer – indeksowanie

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono na dodawanie indeksowania btree w celu usunięcia wygaśniętych wpisów indeksu, aby zapobiec podziałom stron Jest to szczególnie przydatne przy zmniejszaniu przyrostu indeksów w tabelach, których indeksowane kolumny są często aktualizowane Peter Geoghegan
Zezwolono indeksom BRIN na rejestrowanie wielu wartości z zakresu min/max Jest to przydatne, jeżeli istnieją grupy wartości w każdym zakresie stron Tomas Vondra
Zezwolono indeksom BRIN na użycie filtrów bloom Pozwala to, aby indeksy BRIN były bardziej efektywne dla danych, które nie są dobrze zlokalizowane w stosie Tomas Vondra
Zezwolono, aby niektóre indeksy GiST były zbudowane przez wstępne sortowanie danych Wstępne sortowanie odbywa się automatycznie i pozwala na szybsze tworzenie mniejszych indeksów Andrey Borodin
Zezwolono, aby indeksy SP-GiST zawierały kolumny z klauzulą INCLUDE Pavel Borisov

Serwer – optymalizacja

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono na wyszukiwanie hasha dla klauzuli IN z wieloma stałymi Wcześniej kod zawsze skanował sekwencyjnie listę wartości James Coleman, David Rowley
Zwiększono liczbę obszarów wykorzystywanych do szacowania klauzuli OR Tomas Vondra, Dean Rasheed
Zezwolono na używanie extended statistics w wyrażeniach Pozwala to na statystykę grup wyrażeń i kolumn zamiast tylko kolumn, jak w przeszłości. System pg_stats_ext_exprs raportuje takowe statystyki Tomas Vondra
Zezwolono na efektywne skanowanie stosu z przedziału TIDs Poprzednio w przypadku nierównych specyfikacji TDI było potrzebne skanowanie sekwencyjne Edmund Horner, David Rowley
Naprawiono EXPLAIN CREATE TABLE AS i EXPLAIN CREATE MATERIALIZED VIEW dla IF NOT EXISTS Poprzednio, jeżeli obiekt już istniał, EXPLAIN zwracał błąd Bharath Rupireddy

Serwer – ogólna wydajność

Zmiana Dodatkowe informacje Autor/Autorzy
Przyspieszono przetwarzanie migawek widoczności MVCC w systemach z wieloma procesorami i dużą ilością sesji Poprawia to również wydajność, gdy mamy wiele bezczynnych sesji Andres Freund
Dodano metodę wywołania w celu zapamiętania wyników z wewnętrznej – zagnieżdżonej pętli joinów Jest to użyteczne, gdy mały procent wierszy jest zaznaczony ze strony wewnętrznej (inner side). Może być wyłączone przez parametr serwera enable_memoize David Rowley
Umożliwiono window functions wykonywanie sortowania przyrostowego David Rowley
Poprawiono wydajności I/O dla równoległych skanowań sekwencyjnych Dokonano tego dzięki alokowaniu bloków w grupach do równoległych workerów Thomas Munro, David Rowley
Umożliwiono zapytaniu odwołującemu się do wielu tabel obcych równoległe skanowanie tabel obcych postgres_fdw wspiera tego typu skanowanie, jeżeli opcja async_capable jest włączona Robert Haas, Kyotaro Horiguchi, Thomas Munro, Etsuro Fujita
Umożliwiono analyze wstępne pobieranie stron Można to kontrolować za pomocą maintenance_io_concurrency Stephen Frost
Poprawiono wydajność wyszukiwania wyrażeń regularnych Tom Lane
Znacząco poprawiono normalizację Unicode Przyśpiesza to funkcję normalize() i IS NORMALIZED John Naylor
Dodano możliwość użycia kompresji LZ4 na danych TOAST Może to być ustawione na poziomie kolumny lub domyślnie za pomocą parametru serwera default_toast_compression. Serwer musi być skompilowany z opcją –with-lz4, która wspiera tę funkcję. Domyślnym ustawieniem nadal jest pglz Dilip Kumar
Dodano funkcję, dzięki której, gdy parametr serwera compute_query_id jest włączony, wyświetlany jest id zapytania w pg_stat_activity, EXPLAIN VERBOSE, csvlog i opcjonalnie w log_line_prefix Id zapytania wytworzony przez rozszerzenie będzie również wyświetlony Julien Rouhaud
Poprawiono logi dla auto-vacuum i auto-analyze Gdy track_io_timing jest włączone, to raportuje czasy I/O dla auto-vacuum i auto-analyze. Ponadto zapisuje również odczyt bufora i współczynniki poprawności (dirty rates) dla auto-analyze Stephen Frost, Jakub Wartak
Dodano informację odnośnie oryginalnej nazwy użytkownika przekazanej przez klienta w log_connections Jacob Champion

Serwer – monitorowanie

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano funkcję, dzięki której, gdy parametr serwera compute_query_id jest włączony, wyświetlany jest id zapytania w pg_stat_activity, EXPLAIN VERBOSE, csvlog i opcjonalnie w log_line_prefix Id zapytania wytworzony przez rozszerzenie będzie również wyświetlony Julien Rouhaud
Poprawiono logi dla auto-vacuum i auto-analyze Gdy track_io_timing jest włączone, to raportuje czasy I/O dla auto-vacuum i auto-analyze. Ponadto zapisuje również odczyt bufora i współczynniki poprawności (dirty rates) dla auto-analyze Stephen Frost, Jakub Wartak
Dodano informację odnośnie oryginalnej nazwy użytkownika przekazanej przez klienta w log_connections Jacob Champion

Serwer – widoki

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano widok pg_stat_progress_copy, aby informować o postępie COPY Josef Šimánek, Matthias van de Meent
Dodano widok pg_stat_wal, aby informować o aktywności WAL Masahiro Ikeda
Dodano widok pg_stat_replication_slots, aby informować o aktywności slotów replikacji Funkcja pg_stat_reset_replication_slot() resetuje slot statystyczny Sawada Masahiko, Amit Kapila, Vignesh C
Dodano widok pg_backend_memory_contexts, aby informować o użyciu pamięci w sesji Atsushi Torikoshi, Fujii Masao
Dodano funkcję pg_log_backend_memory_contexts(), aby wyświetlała kontekst pamięci dowolnego backendu Atsushi Torikoshi
Dodano sekcję statystyk do widoku pg_stat_database Laurenz Albe
Dodano kolumny do pg_prepared_statements, aby informować o liczbie ogólnych i niestandardowych planów Atsushi Torikoshi, Kyotaro Horiguchi
Dodano czas oczekiwania na blokadę w pg_locks Atsushi Torikoshi
Umożliwiono, aby proces archiwizacji był widoczny w pg_stat_activity Kyotaro Horiguchi
Dodano event WalReceiverExit do informowania o czasie oczekiwania na zamknięcie WAL receivera Fujii Masao
Zaimplementowano widok schematu informacyjnego routine_column_usage, aby śledzić kolumny, do których odwołują się funkcje i procedury domyślnych wyrażeń Peter Eisentraut

Server – autentykacja

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono dopasowanie wyróżniających nazw (DN) certyfikatów SSL na potrzeby autentykacji certyfikatu klienta Nowa opcja pg_hba.conf (clientname=DN) zezwala na porównanie z atrybutami certyfikatu poza CN i może być używana wraz z mapami identyfikującymi (ident maps) Andrew Dunstan
Zezwolono rekordom z pg_hba.conf i pg_ident.conf na zajmowanie wielu linii Znak “\” na końcu linii zezwala na kontynuowanie określania rekordu w następnej linii Fabien Coelho
Zezwolono na specyfikację katalogu dla listy odwołań certyfikatów (CRL) Jest to kontrolowane przez parametr serwera ssl_crl_dir i opcję połączenia libpq o nazwie sslcrldir Kyotaro Horiguchi
Zezwolono na hasła o dowolnej długości Tom Lane, Nathan Bossart

Server – konfiguracja serwera

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano parametr serwera idle_session_timeout w celu zamknięcia bezczynnych sesji Jest to podobne do idle_in_transaction_session_timeout Li Japin
Zmieniono domyślną wartość checkpoint_completion_target na 0.9 Poprzednio wynosiła ona 0.5 Stephen Frost
Zezwolono, aby %P w log_line_prefix informowało o PID lidera grupy równoległej dla równoległego workera Justin Pryzby
Zezwolono na określanie wielu ścieżek oddzielonych przecinkami w unix_socket_directories. Każda ścieżka musi znajdować się w cudzysłowie Ian Lawrence Barwick
Zezwolono na alokację dynamicznej pamięci współdzielonej przy uruchomieniu Kontrolowane jest to przez min_dynamic_shared_memory. Pozwala na lepsze wykorzystanie dużych stron Thomas Munro
Dodano parametr serwera huge_page_size w celu kontrolowania wielkości dużych stron używanych na Linuksie Odin Ugedal

Replikacja strumieniowa i przywracanie

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono serwerom standby synchronizację przez pg_rewind Heikki Linnakangas
Zezwolono, aby ustawienia restore_command były możliwe do zmiany podczas reloadu serwera Można również ustawić restore_command na pusty string i zrobić reload serwera, aby wymusić odzyskiwanie tylko do odczytu z katalogu pg_wal Sergei Kornilov
Dodano parametr serwera log_recovery_conflict_waits, aby informować o długim czasie oczekiwania na konflikt podczas przywracania Bertrand Drouvot, Masahiko Sawada
Dodano zatrzymanie odzyskiwania na serwerze w trybie gotowości, jeżeli serwer podstawowy zmieni swoje parametry w sposób uniemożliwiający odtwarzanie w tym trybie Poprzednio byłby zamykany natychmiastowo. Peter Eisentraut
Dodano funkcje pg_get_wal_replay_pause_state(), aby informować o statusie przywracania Daje to więcej szczegółowych informacji niż pg_is_wal_replay_paused() Dilip Kumar
Dodano nowy parametr tylko do odczytu dla serwera in_hot_standby Pozwala to klientom na łatwe wychwycenie, czy są połączeni do serwera hot standby Haribabu Kommi, Greg Nancarrow, Tom Lane
Przyspieszono obcinanie małych tabel podczas przywracania w klastrze z wieloma współdzielonymi buforami Kirk Jamison
Umożliwiono synchronizację systemu plików na początku odzyskiwania po awarii w systemie Linux Domyślnie PostgreSQL synchronizuje każdy plik w klastrze w bazie danych na początku odzyskiwania po awarii. Po ustawieniu recovery_init_sync_method=syncfs odzyskiwane są natomiast wszystkie systemy plików. Pozwala to na szybsze odzyskanie danych na systemie z wieloma plikami bazy danych Thomas Munro
Dodano funkcję pg_xact_commit_timestamp_origin() w celu zwrócenia wartości timestampa commitu i pochodzenie replikacji określonej transakcji Movead Li
Dodano informację o pochodzeniu replikacji do rekordu zwracanego przez pg_last_committed_xact() Movead Li
Umożliwiono kontrolę funkcji pochodzenia replikacji przy pomocy standardowych zezwoleń funkcji Poprzednio tego typu funkcje mogły być wykonywane przez administratorów (superusers) i nadal jest to domyślnie ustawione Martín Marqués

Replikacja strumieniowa i przywracanie – replikacja logiczna

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono replikacji logicznej strumieniowanie długich transakcji in-progress Poprzednio transakcje, które wykraczały poza logical_decoding_work_mem, były zapisywane na dysku do czasu, gdy transakcja nie dobiegła do końca Dilip Kumar, Amit Kapila, Ajin Cherian, Tomas Vondra, Nikhil Sontakke, Stas Kelvich
Poprawiono API replikacji logicznej, pozwalając strumieniować długie transakcje in-progress Funkcje wyjścia uruchamiane są wraz ze strumieniem. test_decoding jest również wspierane Tomas Vondra, Dilip Kumar, Amit Kapila
Zezwolono na tworzenie wielu transakcji podczas synchronizowania tablic w replikacji logicznej Peter Smith, Amit Kapila, and Takamichi Osumi
Dodano natychmiastowe WAL-logi dla podtransakcji i wysoko-poziomowych powiązań XID Jest to przydatne do dekodowania logicznego Tomas Vondra, Dilip Kumar, Amit Kapila
Ulepszono logiczne dekodowanie API do obsługi commitów dwufazowych Kontroluje się to za pomocą pg_create_logical_replication_slot() Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich
Dodano generowanie wiadomości o błędach WAL podczas wykonywania poleceń, gdy używana jest replikacja logiczna Gdy replikacja logiczna jest wyłączona, błędy WAL są generowane po zakończeniu transakcji. Pozwala to na logiczne strumieniowanie transakcji in-progress Dilip Kumar, Tomas Vondra, Amit Kapila
Poprawiono przetwarzanie cache’ów błędnych informacji podczas logicznego dekodowana Pozwala to na bardziej efektywne działanie logicznego dekodowania w obecności dużej ilości DDL Dilip Kumar
Umożliwiono kontrolę nad tym, czy wiadomości z logicznego dekodowania mają być wysłane do strumienia replikacji David Pirotte, Euler Taveira
Umożliwiono subskrybentom logicznej replikacji używanie trybu transferu binarnego Jest on szybszy niż tryb tekstowy, ale nieco mniej stabilny Dave Cramer
Zezwolono, aby logiczne dekodowanie mogło być filtrowane przez XID Markus Wanner

Klauzule SELECT i INSERT

Zmiana Dodatkowe informacje Autor/Autorzy
Zredukowano liczbę słów kluczowych, które nie mogą być użyte jako nazwa kolumn bez użycia AS Występuje teraz o 90% mniej zabronionych słów Mark Dilger
Umożliwiono tworzenie aliasów dla klauzuli JOIN USING Alias jest tworzony po wpisaniu AS tuż za klauzulą USING Peter Eisentraut
Umożliwiono dodanie klauzuli DISTINCT do GROUP BY w celu usunięcia duplikatów kombinacji GROUPING SET Na przykład GROUP BY CUBE (a,b), CUBE (b,c) wygeneruje duplikat kombinacji Vik Fearing
Poprawiono obsługę wpisów DEFAULT dla INSERT z wielowierszowymi listami VALUES Poprzednio często zwracało to błąd Dean Rasheed
Dodano klauzule SEARCH i CYCLE zgodne ze standardem SQL dla typowych wyrażeń tabelowych Te same wyniki można osiągnąć przy użyciu istniejącej składni, ale znacznie mniej wygodnie Peter Eisentraut
Umożliwiono nazwom kolumn w klauzuli WHERE ON CONFLICT być table-qualified Można jednak odwoływać się tylko do tabeli docelowej Tom Lane

Polecenia użytkowe

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono REFRESH MATERIALIZED VIEW używanie równoległości Bharath Rupireddy
Umożliwiono REINDEX zmianę przestrzeni tablicy (tablespace) nowego indeksu Zrobiono to dzięki dodaniu klauzuli TABLESPACE. Opcja –tablespace jest również dodana do reindexdb Alexey Kondratov, Michael Paquier, Justin Pryzby
Umożliwiono REINDEX przetwarzanie wszystkich potomnych tablic i indeksów relacji partycjonowanej Justin Pryzby, Michael Paquier
Dodano komendy indeksowania używając CONCURRENTLY, aby zapobiegać oczekiwaniu na zakończenie innych operacji używających CONCURRENTLY Álvaro Herrera
Poprawiono wydajność metody COPY FROM w trybie binarnym Bharath Rupireddy, Amit Langote
Zachowano standardową składnię SQL dla funkcji w definicjach widoku Poprzednio wywołanie standardowej funkcji SQL, takiej jak EXTRACT(), było pokazane w zwykłej składni wywołania funkcji Tom Lane
Dodano w standardzie SQL klauzulę GRANTED BY, aby wykonać GRANT i REVOKE Peter Eisentraut
Dodano opcję OR REPLACE dla CREATE TRIGGER Pozwala to na warunkowe zastąpienie istniejących już triggerów Takamichi Osumi
Umożliwiono TRUNCATE operowanie na tabelach obcych Moduł postgres_fdw również to wspiera Kazutaka Onishi, Kohei KaiGai
Ułatwiono dodawane i usuwane publikacji z subskrypcji Nowa składnia to ALTER SUBSCRIPTION … ADD/DROP PUBLICATION. Pozwala to uniknąć konieczności określania wszystkich publikacji w celu dodania/usunięcia wpisów Japin Li
Dodano klucze główne i obce wraz ze stałymi do katalogów systemowych Zmiana ta pomaga narzędziom GUI analizować katalogi systemowe. Istniejące unikalne indeksy katalogów mają teraz skojarzone stałe UNIQUE lub PRIMARY KEY. Relacje kluczy obcych nie są aktualnie przechowywane jako stałe, ale mogą być wyświetlone za pomocą funkcji pg_get_catalog_foreign_keys() Peter Eisentraut
Zezwolono na akceptację CURRENT_ROLE w każdym miejscu, gdzie jest akceptowany CURRENT_USER Peter Eisentraut

Typy danych

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono rozszerzeniom i wbudowanym typom danych używanie indeksów Poprzednio używanie indeksów musiało być hardkodowane w serwer i mogło być używane jedynie do typów tablicowych Dmitry Dolgov
Zezwolono na indeksy JSONB Indeksy JSONB mogą być użyte do znalezienia i przydzielenia części dokumentów JSONB Dmitry Dolgov
Dodano wsparcie dla wielozakresowych typów danych Są one podobne do zakresu typów danych, ale zezwalają na określenie wielu uporządkowanych zbiorów rozłącznych. Powiązany typ wielozakresowy jest tworzony automatycznie dla każdego typu zakresu Paul Jungwirth, Alexander Korotkov
Dodano obsługę języka ormiańskiego, baskijskiego, katalońskiego, hindi, serbskiego i jidysz Peter Eisentraut
Umożliwiono plikom tsearch posiadanie nielimitowanej długości linii Poprzedni limit był ustawiony na 4KB. Dodatkowo usunięto funkcję t_readline() Tom Lane
Dodano wsparcie dla wartości numerycznych Infinity i -Infinity Dla danych typu Float są one już wspierane Tom Lane
Dodano operatory <<| i |>> reprezentujące ściśle powyżej/poniżej testów Poprzednio były nazywane >^ i <^, ale to nazewnictwo jest niezgodne z innymi typami danych geometrycznych. Stare nazwy pozostały dostępne, ale kiedyś mogą zostać usunięte Emre Hasegeli
Wprowadzono operatory do dodania i odjęcia wartości LSN oraz numerycznej Fujii Masao
Binarny transfer danych jest teraz mniej restrykcyjny dla niezgodności tablic i rekordów OID Tom Lane
Dodano możliwość tworzenia złożonych typów tablic dla katalogów systemowych Relacje zdefiniowane przez użytkownika od dawna mają powiązane typy złożone, a także typy tablicowe nad tymi typami złożonymi. Katalogi systemowe działają teraz na tej samej zasadzie. Ta zmiana rozwiązuje niespójności polegające na tym, że tworzenie tabeli zdefiniowanej przez użytkownika w trybie jednego użytkownika nie powodowałoby utworzenia typu tablicy złożonej Wenjing Zeng

Funkcje

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono funkcjom i procedurom języka SQL używanie standardowego ciała funkcji SQL (SQL-standard function bodies) Poprzednio tylko ciała funkcji typu string były wspierane. Kiedy pisze się funkcję bądź procedurę w standardzie SQL, ciało jest parsowane natychmiastowo i przechowywane jako parse tree. Pozwala to na lepsze śledzenie zależności funkcji i może przynieść korzyści w zakresie bezpieczeństwa Peter Eisentraut
Umożliwiono procedurom posiadanie parametru OUT Peter Eisentraut
Umożliwiono niektórym tablicom funkcji działanie na kilku kompatybilnych typach danych Funkcje array_append(), array_prepend(), array_cat(), array_position(), array_positions(), array_remove(), array_replace() i width_bucket() przyjmują teraz argumenty anycompatiblearray zamiast anyarray. Oznacza to, że są mniej restrykcyjne w kwestii dopasowań typów argumentów Tom Lane
Dodano funkcję trim_array(), która jest zgodna ze standardem SQL Można to już zrobić za pomocą wycinków tablicy, ale jest to trudniejsze Fearing
Dodano bajtowe odpowiedniki dla ltrim() i rtrim() Joel Jacobson
Dodano wsparcie negatywnych indeksów w split_part() Negatywne wartości zaczynają się od ostatniego pola i liczą wstecz Nikhil Benesch
Wprowadzono nową funkcję string_to_table(), aby rozdzielić string pewnymi ogranicznikami Jest to podobne do funkcji regexp_split_to_table() Pavel Stehule
Dodano funkcję unistr(), aby zezwolić na tworzenie znaków Unicode w stringu poprzez wpisanie ukośnika wstecznego z numerem w notacji szesnastkowej Podobnie można określać Unicode w stringach literalnych (literal strings) Pavel Stehule
Dodano funkcję agregującą bit_xor() Alexey Bashtanov
Wprowadzono funkcję bit_count(), która zwraca ilość włączonych(set) bitów w stringu bitów lub bajtów David Fetter
Dodano funkcję date_bin() Ta funkcja grupuje wejściowe timestampy w interwały o jednakowej długości, dopasowane do określonego początku John Naylor
Umożliwiono make_timestamp()/make_timestamptz() akceptację minusowych wartości roku Minusowe wartości są interpretowane jako lata P.N.E. Peter Eisentraut
Zmieniono wyrażenie regularne substring() Poprawione wyrażenie zgodne ze standardem SQL ma następującą składnię: SUBSTRING(tekst SIMILAR wzór ESCAPE znak-ucieczki). Poprzednia składnia wyglądała następująco: SUBSTRING(tekst FROM wzór FOR znak-ucieczki). Jest ona nadal akceptowalna przez PostgreSQL Peter Eisentraut
Umożliwiono ucieczkę znaków \D, \S i \W wewnątrz nawiasów wyrażeń regularnych Tom Lane
Dodano wyrażenie regularne [[:word:]], które jest równoważne do \w Tom Lane
Umożliwiono/dodano wartościom domyślnym funkcji lead() i lag() dla window functions większą elastyczność typów danych Vik Fearing
Każda niezerowa wartość Float dzielona przez Infinity zwraca teraz zero Poprzednio takie operacje zwracały błąd Kyotaro Horiguchi
NaN dzielone przez zero zwraca teraz wartość NaN Poprzednio takie operacje zwracały błąd Tom Lane
Wywołanie exp() i power() dla -Infinity zwraca teraz zero Poprzednio takie operacje zwracały błąd Tom Lane
Poprawiono dokładność obliczeń geometrycznych z wykorzystaniem nieskończoności Tom Lane
Oznaczono wbudowane funkcje przymusu (coercion functions) bezpieczne(leakproof) Pozwala to na większe wykorzystanie funkcji wymagających konwersji typu w sytuacjach wrażliwych na bezpieczeństwo Tom Lane
Zmieniono pg_describe_object(), pg_identify_object() i pg_identify_object_as_address(), aby zawsze informowały o błędach dotyczących nieistniejących obiektów Michael Paquier

PL/pgSQL

Zmiana Dodatkowe informacje Autor/Autorzy
Poprawiono parsowanie wyrażeń i przypisań PL/pgSQL Pozwala to na przypisanie do wycinków tablicy i zagnieżdżonych pól rekordów Tom Lane
Umożliwiono uruchamianie zapytań RETURN QUERY równolegle w plpgsql Tom Lane
Poprawiono wydajność powtarzalnych wywołań CALL w ramach procedur plpgsql Pavel Stehule, Tom Lane

Interfejs klienta

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano tryb potoku do libpq Pozwala to na wysłanie wielu zapytań oczekujących na zakończenie tylko wtedy, gdy zostanie wysłana określona wiadomość synchronizacyjna Craig Ringer, Matthieu Garrigues, Álvaro Herrera
Ulepszono opcję parametru target_session_attrs w libpq Nowe opcje to read-only, primary, standby i prefer-standby Haribabu Kommi, Greg Nancarrow, Vignesh C, Tom Lane
Poprawiono format outputu libpq PQtrace() Aya Iwata, Álvaro Herrera
Dodano możliwość powiązania identyfikatora ECPG SQL z określonym połączeniem Zrobiono to dzięki DECLARE … STATEMENT Hayato Kuroda

Aplikacje klienta

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono vacuumdb omijanie indeksów cleanup i truncation Opcje są następujące: –no-index-cleanup –no-truncate. Nathan Bossart
Umożliwiono pg_dump zgrywanie jedynie niektóre rozszerzeń Jest to kontrolowane przez opcję –extension Guillaume Lelarge
Do pgbench dodano funkcję permute(), która losowo zamienia wartości Fabien Coelho, Hironobu Suzuki, Dean Rasheed
Dodano możliwość podglądu czasu odłączenia (disconnection times) podczas ponownego połączenia (reconnection overhead) w pgbench, wykorzystując przełącznik -C Yugo Nagata
Umożliwiono użycie wielokrotnego -v w celu zwiększenia szczegółowości informacji Jest to wspierane przez pg_dump, pg_dumpall i pg_restore Tom Lane

Aplikacje klienta – psql

Zmiana Dodatkowe informacje Autor/Autorzy
W psql umożliwiono poleceniom \df i \do określanie typów argumentów funkcji i operatorów Pomaga to zredukować liczbę wyświetlanych dopasowań Greg Sabino Mullane, Tom Lane
Dodano metodę dostępu do kolumny w psql \d – + Georgios Kokolatos
W psql umożliwiono poleceniom \dt i \di wyświetlanie tablic TOAST i ich indeksów Justin Pryzby
Dodano do psql nową komendę \dX, która listuje obiekty potrzebne statystycznie (extended statistics) Tatsuro Yamada
Naprawiono psql-ową komendę /dT, aby rozumiała składnię tablic i aliasy gramatyczne, takie jak int dla intigera Greg Sabino Mullane, Tom Lane
Podczas edycji poprzedniego zapytania lub pliku z \e psql lub przy użyciu \ef lub \ev i jeśli edytor ma zakończyć działanie bez zapisywania, to jego wyniki będą zignorowane Wcześniej takie edycje ładowały poprzednie zapytanie do bufora zapytań i zazwyczaj wykonywały je natychmiast. Uznano, że prawdopodobnie nie jest to to, czego chce użytkownik Laurenz Albe
Poprawiono uzupełnianie etykiet Vignesh C, Michael Paquier, Justin Pryzby, Georgios Kokolatos, Julien Rouhaud

Aplikacje serwera

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano narzędzie wiersza poleceń pg_amcheck, aby uprościć uruchamianie testów contrib/amcheck na wielu relacjach Mark Dilger
Dodano opcję –no-instructions do initdb Powoduje to pominięcie instrukcji uruchamiania serwera, które są normalnie wyświetlane Magnus Hagander
Zmieniono zachowanie pg_upgrade, aby zatrzymywał działanie przed tworzeniem skryptu analyze_new_cluster Zamiast tego podaje porównywalne instrukcje vacuumdb Magnus Hagander
Usunięto wsparcie dla opcji postmaster -o Było to niepotrzebne, ponieważ wszystkie przekazane opcje można było już określić bezpośrednio Magnus Hagander

Dokumentacja

Zmiana Dodatkowe informacje Autor/Autorzy
Zmieniono nazewnictwo „Default Roles” na „Predefined Roles” Bruce Momjian, Stephen Frost
Dodano dokumentację dla funkcji factorial() Wraz z usunięciem operatora ! w tym wydaniu funkcja factorial() jest jedynym wbudowanym sposobem obliczania silni Peter Eisentraut

Kod źródłowy

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano opcję konfiguracyjną –with-ssl={openssl}, aby umożliwić przyszły wybór biblioteki SSL Opcja –with-openssl jest dostępna w celach kompatybilności Daniel Gustafsson, Michael Paquier
Dodano wsparcie dla abstrakcyjnych gniazd w domenie Unix Aktualnie jest to wspierane na systemie Linux i Windows Peter Eisentraut
Umożliwiono systemowi Windows poprawną obsługę plików większych niż 4 GB Pozwala to na przykład na COPY plików WAL, a pliki segmentów relacji mogą być większe niż 4 GB Juan José Santamaría Flecha
Dodano parametr serwera debug_discard_caches w celu kontroli czyszczenia cache’a w celach testowych Poprzednio takie zachowanie można było ustawić jedynie w czasie kompilacji. Aby wywołać je podczas initdb, należy użyć nowej opcji –discard-caches. Craig Ringer
Dodano różne ulepszenia w wykrywaniu błędów w valgrind Álvaro Herrera, Peter Geoghegan
Dodano moduł testowy dla pakietów wyrażeń regularnych Tom Lane
Dodano wsparcie dla LLVM w wersji 12 Andres Freund
Zmieniono SHA1, SHA2 i MD5, aby używały OpenSSL EVP API Jest to bardziej nowoczesne i wspiera tryb FIPS Michael Paquier
Usunięto osobną kontrolę czasu kompilacji podczas wyboru generatora liczb losowych Teraz jest to wybierane przy pomocy biblioteki SSL Daniel Gustafsson
Dodano bezpośrednią konwersję między kodowaniem EUC_TW i Big5 Heikki Linnakangas
Dodano sortowanie wersji dla FreeBSD Thomas Munro
Dodano dostęp amadjustmembers do API dostępu indeksów (index access method API) Umożliwia to sprawdzenie poprawności podczas tworzenia nowego operatora klasy czy operatora rodziny Tom Lane
Wprowadzono makra testowania funkcji libpq-fe.h dla ostatnio dodanych funkcji libpq W przeszłości aplikacje zwykle używały sprawdzenia w czasie kompilacji PG_VERSION_NUM w celu sprawdzenia, czy funkcja jest dostępna. Ale zwykle jest to wersja serwera, która niekoniecznie będzie zgodna z wersją libpq. libpq-fe.h oferuje symbole #define oznaczające funkcje widoczne dla aplikacji, a dodane w wersji v14. Celem jest dalsze dodawanie symboli dla takich funkcji w przyszłych wersjach Tom Lane, Álvaro Herrera

Dodatkowe moduły

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono indeksowanie wartości hstore Tom Lane, Dmitry Dolgov
Umożliwiono indeksom GiST/GIN pg_trgm wyszukiwanie równości Jest to podobne do LIKE z wyjątkiem działania symboli wieloznacznych Julien Rouhaud
Typ danych Cube może być przesyłany w trybie binarnym KaiGai Kohei
Umożliwiono raportowanie pgstattuple_approx() w tabelach TOAST Peter Eisentraut
Dodano moduł pg_surgery pozwalający na zmianę widoczności wiersza Jest przydatny podczas korygowania uszkodzeń bazy Ashutosh Sharma
Dodano moduł old_snapshot informujący o mapowaniu XID/time wykorzystywanym przez aktywny old_snapshot_threshold Robert Haas
Umożliwiono amcheck sprawdzanie strony stosu Poprzednio sprawdzane były jedynie strony indeksów B-Tree Mark Dilger
Umożliwiono pageinspect sprawdzanie indeksów GiST Andrey Borodin, Heikki Linnakangas
Numery bloku pageinspect stały się typami Bigint Peter Eisentraut
Oznaczono funkcje btree_gist jako bezpieczne do zrównoleglania Steven Winfield

Dodatkowe moduły – pg_stat_statements

Zmiana Dodatkowe informacje Autor/Autorzy
Przeniesiono obliczanie hash’a zapytania z pg_stat_statements na rdzeń serwera Domyślna wartość ‘auto’ nowego parametru serwera compute_query_id włącza automatyczne obliczenia id zapytania podczas ładowania tego rozszerzenia Julien Rouhaud
pg_stat_statements śledzi instrukcje top i nested oddzielnie Wcześniej wszystkie instrukcje były śledzone jednocześnie i dawały pojedynczy output. Bardziej przydatne jest oddzielenie tych funkcji Julien Rohaud
Dodano liczbę wierszy dla poleceń użytkowych w pg_stat_statements Fujii Masao, Katsuragi Yuta, Seino Yuki
Dodano widok do pg_stat_statements_info, aby ukazać aktywność pg_stat_statements Katsuragi Yuta, Yuki Seino, Naoki Nakamichi

Dodatkowe moduły – postgres_fdw

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono postgres_fdw zbiorczy INSERT wierszy Takayuki Tsunakawa, Tomas Vondra, Amit Langote
Umożliwiono postgres_fdw importowanie partycji tabeli, jeżeli było to określone przez IMPORT FOREIGN SCHEMA … Domyślnie importowany jest jedynie katalog główny tabeli partycjonowanej Matthias van de Meent
Dodano funkcję postgres_fdw_get_connections() do postgres_fdw w celu informowania o otwartych połączeniach do obcego serwera Bharath Rupireddy
Umożliwiono kontrolę nad tym, czy obce serwery utrzymują otwarte połączenia po zakończeniu transakcji Jest to kontrolowane przez keep_connections i domyślnie jest włączone Bharath Rupireddy
W razie potrzeby można teraz ponownie nawiązać połączenie do obcych serwerów Poprzednio restart obcego serwera mógł powodować błędy dostępu Bharath Rupireddy
Dodano funkcjonalność odrzucenia połączeń trzymanych w cache’u Bharath Rupireddy

Dalszy rozwój

Powyższa lista nowych funkcjonalności w PostgreSQL świadczy o stałym rozwoju i zaangażowaniu wielu społeczności, których celem jest tworzenie najlepszego oraz najszybszego silnika bazy danych. Z radością będziemy obserwować kolejne lata rozwoju Postgresa i informować Was o wszelkich nowościach.

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.