Po letu dni razvoja je bila objavljena nova stabilna različica DBMS PostgreSQL 18. Posodobitve za novo različico bodo izhajale pet let, do novembra 2030. Podpora za PostgreSQL 13.x, najstarejšo od podprtih različic, bo prenehala 13. novembra.
Glavne novosti:
- Dodana je podsistem asinh kroničnega vnosa/izvora, ki omogoča povečanje propustnosti vnosa/izvora ter odpravo zakasnitve. Poleg univerzalne implementacije AIO (io_method=worker), dostopne na vseh platformah in temelji na izvajanju več procesov obdelave (privzeto 3), je v Linuxu na voljo vmesnik za asinh kronični vhod/izhod io_uring (io_method=io_uring), podprt od jedra Linux 5.1. Asinh kronični vhod/izhod se zaenkrat uporablja le za pospeševanje izvajanja nekaterih operacij, povezanih z branjem podatkov iz datotečnega sistema, kot so zaporedno preverjanje, skeniranje bitne karte indeksov in izvedba čiščenja (vacuum). V nekaterih preskusih uporaba AIO privede do povečanja zmogljivosti za 2-3 krat. Operacije pisanja še vedno potekajo v sinhronem načinu, da se izpolnijo zahteve ACID.
- Uvedena je optimizacija ‘skip scan’ v večstolpčnih indeksih, ki omogoča uporabo indeksa ne le za preverjanje prvega indeksiranega stolpca in celotne povezave stolpcev, ampak tudi za obravnavo preostalih indeksiranih stolpcev posebej. Na primer, prej je bil pri ustvarjanju B-tree indeksa nad stolpci ‘(status, date)’ indeks uporabljen le za poizvedbe, ki preverjajo polje ‘status’ ali obe polji ‘status’ in ‘date’; pri preverjanju samo polja ‘date’ se je izvajalo skeniranje vsebine tabele. Način ‘skip scan’ omogoča, da se v določenih situacijah indeks skenira pri poizvedbi, ki zahteva le polje ‘date’. Ta način se uporablja le za indekse ‘B-tree’ pri uporabi pogojnega operatorja ‘=’ nad indeksiranim poljem, v primerih, ko ima izpuščeno polje malo različnih vrednosti (na primer, optimizacija deluje, če ima polje status ‘status’ nekaj fikseranih vrednosti).
- Dodane optimizacije, ki učinkoviteje uporabljajo indekse za poizvedbe, ki vsebujejo konstrukcije „OR“ in „IN (…)“ v bloku „WHERE“, ter povečujejo uspešnost načrtovanja in izvajanja združevanja tabel (na primer, pospešen je koda za združevanje hash in omogočeno je uporabljati inkrementalno sortiranje pri združevanju tabel).
- Dodana je podpora za razporeditev gradnje indeksov GIN (Generalized Inverted Index), ki se uporabljajo za indeksiranje sestavljenih vrednosti, kot so tabele, ter za organizacijo iskanja po polno besedilnih podatkih ali strukturah JSON.
- Dodana je možnost ustvarjanja materializiranih pogledov in ključev za sekcioniranje tabel z indeksi s oznako „unique“, ki ne uporabljajo strukture B-tree.
- Povečana je splošna uspešnost zaklepanja za poizvedbe, ki obravnavajo veliko število tabel, prav tako pa so bile izboljšave v obdelavi poizvedb na sekcioniranih tabelah, ki pospešujejo izločanje neuporabljenih sekcij in operacije združevanja (JOIN).
- Pospešene so operacije s tekstom, kot so funkcije za pretvorbo v velike/male črke. Dodan je način PG_UNICODE_FAST za pospešitev upoštevanja lastnosti locale Unicode-znakov.
- Zagotovljena je možnost shranjevanja statistike načrtovalnika poizvedb po posodobitvi med pomembnimi različicami PostgreSQL. Sprememba omogoča izogibanje napornim operacijam „ANALYZE“ po zagonu nove različice, do katere pride do zmanjšanja uspešnosti DBMS.
- Povečana je uspešnost orodja pg_upgrade, ki se uporablja za avtomatizacijo prehoda na novo pomembno izdajo PostgreSQL. Optimizacije so še posebej opazne pri nadgradnji DB-jev, ki vsebujejo veliko število objektov, kot so tabele in zaporedja. Za pospešitev dela pg_upgrade je dodana oznaka „—jobs N“ za razporeditev preverjanj v N niti ter oznaka „—swap“ za zamenjavo katalogov s podatki v celoti brez nastavitve povezav, brez kloniranja in brez kopiranja datotek.
- Dodana je podpora za virtualne generirane stolpce, katerih vrednosti se izračunajo sproti med izvajanjem poizvedb, brez shranjevanja na disk. Če je v izrazu „CREATE TABLE…“ za generirane stolpce navedena le ključno besedo „GENERATED“ brez določanja tipa (STORED ali VIRTUAL), potem se nova različica uporablja privzeto namesto stare implementacije. V stari implementaciji so se vrednosti generirale med izvajanjem opravil „INSERT“ ali „UPDATE“ in so se shranjevale na disk za kasnejšo uporabo. Slabost virtualnih generiranih stolpcev je, da jih ni mogoče uporabiti v indeksih, prednost pa je v tem, da omogočajo normalizacijo in spremembo podatkov sproti (kar je pomembno pri delu s podatki JSON). Glede klasičnih shranjenih generiranih stolpcev je v novi različici zagotovljena podpora za logično replikacijo.
- V ukazih INSERT, UPDATE, DELETE in MERGE je bila uvedena možnost izhoda prejšnjih (OLD) in trenutnih (CURRENT) vrednosti v izrazu RETURNING. Na primer, „UPDATE… RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.“.
- Dodana je funkcija uuidv7() za generiranje naključnih unikatnih identifikatorjev v formatu UUIDv7. V nasprotju s staro funkcijo za generiranje UUID (gen_random_uuid), ki je zdaj dodatno dostopna pod imenom uuidv4(), UUIDv7 vključuje čas generiranja poleg naključne vrednosti. Prisotnost urejenih delov v vrednosti UUID (prvih 12 simbolov — epoch čas, naslednjih 18 — naključna vrednost) povečuje učinkovitost sortiranja in indeksiranja, kar je pomembno, saj se UUID običajno uporablja za primarne ključe (na primer, ključi, ustvarjeni v bližnjem času, so v indeksu blizu drug drugega).
- V operaciji „LIKE“ je bila uvedena podpora za ujemanja s tekstom, kjer se uporabljajo nedeterministične lastnosti lokalizacije „collation“, ki omogočajo ujemanja ob upoštevanju pomena simbolov (na primer, pri primerjanju se lahko ne upošteva naglas). Dodana je funkcija CASEFOLD za spreminjanje velikosti črk ob upoštevanju lastnosti lokalizacije „collation“ (na primer, nekateri simboli imajo več kot dve majhni različici ali pri primerjanju zahtevajo pretvorbo v veliko začetnico, ne pa v malo).
- Dodana je mogućnost korišćenja vremenskih ograničenja (temporal constraint). U vrednostima „PRIMARY KEY“ i „UNIQUE“ za dodavanje vremenskih ograničenja treba koristiti izraz „WITHOUT OVERLAPS“, dok se za vrednost „FOREIGN KEY“ koristi izraz PERIOD. Na primer, pri definisanju primarnih ključeva moguće je ograničiti ključeve sa preklapajućim vremenskim intervalima.
- Dodata je komanda „CREATE FOREIGN TABLE … LIKE command“ za kreiranje sheme spoljne tabele na osnovu definicije lokalne tabele.
- Dodata je podrška za povezivanje sa DBMS koristeći autentifikaciju baziranu na OAUTH 2.0, primenom pristupnog tokena umesto lozinke. Korišćenje OAUTH omogućava da lozinke ne budu pohranjene u Bazi podataka, a identifikacija korisnika se vrši putem spoljnjih servisa, kao i korišćenje mogućnosti kao što su višefaktorska autentifikacija i jedinstvena tačka pristupa (SSO).
- Dodata je funkcija ssl_tls13_ciphers(), preko koje se može odrediti lista algoritama šifrovanja koji su dozvoljeni prilikom povezivanja koristeći protokol TLSv1.3.
- Podrška za autentifikaciju pomoću algoritma md5 za heširanje lozinki prešla je u kategoriju zastare i planirano je uklanjanje. Umesto md5 preporučuje se korišćenje algoritma SCRAM (SCRAM-SHA-256), koji je uveden u PostgreSQL 10. Dodatno se ističe implementacija podrške za prosleđivanje autentifikacije bazirane na SCRAM prilikom povezivanja kroz postgres_fdw i dblink sa spoljnim PostgreSQL serverima.
- Prilikom izvođenja operacije „EXPLAIN ANALYZE“ obezbeđeni su podaci o broju operacija pretrage u indeksima prilikom skeniranja indeksa i broju pristupa baferima prilikom izvršavanja upita. U izlaz „EXPLAIN ANALYZE VERBOSE“ uključena je statistika o CPU, WAL dnevniku i intenzitetu operacija čitanja. U tabelu pg_stat_all_tables dodate su informacije o vremenu potrošenom na operaciju VACUUM i analizu tabeli. Pružena je statistika o intenzitetu ulaz/izlaz i opterećenju na WAL dnevniku po pojedinačnim vezama. U pg_stat_subscription_stats i logovima dodate su informacije sa dijagnostikom sukoba prilikom izvršavanja operacija pisanja tokom logičke replikacije.
- U novim instalacijama po defaultu je uključena upotreba kontrolnih suma za proveru integriteta pohranjenih podataka. Da bi se ovo ponašanje onemogućilo prilikom pokretanja initdb, potrebno je navesti opciju „—no-data-checksums“.
- V utilitě pg_createsubscriber byla přidána vlajka „—all“ pro vytvoření logických replik jedním příkazem pro všechny databáze.
- Byla implementována nová verze (3.2) protokolu, který se používá pro interakci externích nástrojů s DBMS a je realizován v knihovně libpq. Poslední aktualizace protokolu proběhla v PostgreSQL 7.4 (rok 2003). V knihovně libpq se nadále používá výchozí verze 3.0.
Izvor: opennet.ru
