Po roku prac rozwojowych opublikowano nową stabilną wersję bazy danych PostgreSQL 14. Aktualizacje dla nowej wersji będą wydawane przez pięć lat, aż do listopada 2026 roku.
Główne nowości:
- Dodano wsparcie dla dostępu do danych JSON za pomocą wyrażeń przypominających pracę z tablicami: SELECT (‘{ "postgres": { "release": 14 }}’::jsonb)[‘postgres’][‘release’]; SELECT * FROM test WHERE details[‘attributes’][‘size’] = ‘"medium"‘;
Podobna składnia została wprowadzona również dla danych w formacie klucz/wartość, zapewnianych przez typ hstore. Tego typu składnia została pierwotnie zaimplementowana przy użyciu uniwersalnego frameworka, który w przyszłości może być wykorzystany również dla innych typów. Przykład dla typu hstore: INSERT INTO mytable VALUES (‘a=>b, c=>d’); SELECT h[‘a’] FROM mytable; UPDATE mytable SET h[‘c’] = ‘new’;
- Rodzina typów do określania zakresów została rozszerzona o nowe typy „multirange”, które umożliwiają definiowanie uporządkowanych list nieprzekraczających się zakresów wartości. Oprócz każdego istniejącego typu range zaproponowano jego własny typ multirange, np. typowi „int4range” odpowiada „int4multirange”, a „daterange” — „datemultirange”. Wykorzystanie nowych typów upraszcza konstruowanie zapytań manipulujących złożonymi sekwencjami zakresów. SELECT ‘{[3,7), [8,9)}’::int4multirange; SELECT nummultirange(numrange(1.0, 14.0), numrange(20.0, 25.0));
- Wprowadzone optymalizacje mają na celu zwiększenie wydajności wysoko obciążonych systemów, obsługujących dużą liczbę połączeń. W niektórych testach zaobserwowano dwukrotny wzrost wydajności.
- Zwiększono efektywność działania indeksów B-tree i rozwiązano problem z rozrastającymi się indeksami przy częstym aktualizowaniu tabel.
- Dodano wsparcie dla trybu przetwarzania równoległego (realizowanego na poziomie libpq) po stronie klienta, co znacząco przyspiesza scenariusze pracy z bazą danych związane z wykonywaniem dużej liczby drobnych operacji zapisu (INSERT/UPDATE/DELETE) poprzez wysyłanie kolejnego zapytania bez czekania na wynik poprzedniego. Tryb ten również przyspiesza pracę przy połączeniach z dużymi opóźnieniami w dostarczaniu pakietów.
- Rozszerzono możliwości dla rozproszonych konfiguracji, obejmujących wiele serwerów PostgreSQL. W realizacji replikacji logicznej dodano możliwość przesyłania w trybie strumieniowym transakcji, które są w trakcie realizacji, co znacząco zwiększa wydajność replikacji dużych transakcji. Dodatkowo zoptymalizowano logiczne dekodowanie danych dostarczanych w procesie replikacji logicznej.
- W mechanizmie podłączenia zewnętrznych tabel Foreign Data Wrapper (postgres_fdw) dodano wsparcie dla równoległego przetwarzania zapytań, które na razie można stosować tylko do podłączenia do innych serwerów PostgreSQL. W postgres_fdw dodano także wsparcie dla dodawania danych do zewnętrznych tabel w trybie batch oraz możliwość importowania tabel partycjonowanych przez określenie dyrektywy „IMPORT FOREIGN SCHEMA”.
- Wprowadzono optymalizacje w realizacji operacji VACUUM (czyszczenie i pakowanie przestrzeni dyskowej). Dodano tryb awaryjny czyszczenia („emergency mode”), który pomija nieistotne operacje czyszczenia, gdy tworzone są warunki do przejścia na drugi krąg identyfikatorów transakcji (transaction ID wraparound). Zredukowano koszty operacyjne podczas przetwarzania indeksów w formacie B-Tree. Znacząco przyspieszono wykonywanie operacji „ANALYZE”, zbierającej statystyki na temat pracy bazy danych.
- Dodano możliwość konfiguracji metody kompresji stosowanej w systemie TOAST, odpowiedzialnym za przechowywanie dużych danych, takich jak bloki tekstu czy informacje geometryczne. Oprócz metody kompresji pglz w TOAST można teraz stosować algorytm LZ4.
- Rozszerzono narzędzia do monitorowania pracy systemu zarządzania bazą danych. Dodano widoki do śledzenia postępu wykonywania poleceń „COPY” (pg_stat_progress_copy), statystyk o slotach replikacji (pg_stat_replication_slots) oraz aktywności związanej z dziennikiem WAL transakcji (pg_stat_wal). Dodano funkcję compute_query_id, umożliwiającą w różnych podsystemach, takich jak pg_stat_activity i EXPLAIN VERBOSE, śledzenie zapytań z przypisaniem unikalnego identyfikatora dla każdego zapytania.
- W planie zapytań wprowadzono optymalizacje, które poprawiają równoległe przetwarzanie zapytań, co pozwala zwiększyć wydajność jednoczesnego wykonywania operacji sekwencyjnego skanowania rekordów, równoległego uruchamiania zapytań w PL/pgSQL za pomocą polecenia „RETURN QUERY” oraz równoległego wykonywania zapytań w „REFRESH MATERIALIZED VIEW”. W celu zwiększenia wydajności cyklicznych zagnieżdżonych złączeń (join) wdrożono wsparcie dla dodatkowego buforowania.
- Do optymalizacji wyrażeń teraz można wykorzystać rozszerzoną statystykę, a do optymalizacji funkcji okiennych — inkrementalne sortowanie.
- W procedurach składowanych, umożliwiających zarządzanie transakcjami w blokach kodu, wprowadzono wsparcie dla definiowania danych zwracanych za pomocą parametrów „OUT”.
- Dodano funkcję date_bin do zaokrąglania wartości typu timestamp zgodnie z zadanym przedziałem. SELECT date_bin(’15 minutes’, TIMESTAMP ‘2020-02-11 15:44:17’, TIMESTAMP ‘2001-01-01’); 2020-02-11 15:30:00
- Dodano wyrażenia SEARCH i CYCLE zdefiniowane w standardzie SQL, które upraszczają porządkowanie i identyfikację cykli w rekursywnych ogólnych wyrażeniach tabelarycznych (Common Table Expression, CTE). WITH RECURSIVE search_tree(id, link, data) AS ( SELECT t.id, t.link, t.data FROM tree t UNION ALL SELECT t.id, t.link, t.data FROM tree t, search_tree st WHERE t.id = st.link ) SEARCH DEPTH FIRST BY id SET ordercol SELECT * FROM search_tree ORDER BY ordercol;
- W narzędziu psql poprawiono autouzupełnianie poleceń po naciśnięciu tabulatora, dodano możliwość wyświetlania argumentów funkcji w poleceniu „\df”, a w poleceniu „\dX” rozszerzono statystyki wyjściowe.
- Umożliwiono przypisywanie użytkownikom uprawnień, które pozwalają tylko na odczyt lub tylko na zapis. Uprawnienia mogą być przypisane do poszczególnych tabel, widoków i schematów za pomocą predefiniowanych ról pg_read_all_data i pg_write_all_data. GRANT pg_read_all_data TO user1;
- W nowych instalacjach domyślnie zastosowano uwierzytelnianie hasłem z wykorzystaniem metody SCRAM-SHA-256 zamiast md5 (parametr „password_encryption” w generowanej postgresql.conf ustawia się teraz na wartość ‘scram-sha-256’).
Źródło: opennet.ru
