După un an de dezvoltare, a fost publicată noua ramură stabilă a SGBD-ului PostgreSQL 18. Actualizările pentru noua ramură vor fi lansate timp de cinci ani, până în noiembrie 2030. Suportul pentru PostgreSQL 13.x, cea mai veche dintre ramurile susținute, se va încheia pe 13 noiembrie.
Noutăți principale:
- A fost adăugat un subsistem de intrare/ieșire asincronă, care permite creșterea lățimii de bandă a intrării/ieșirii și eliminarea întârzierilor. Pe lângă implementarea universală AIO (io_method=worker) disponibilă pe toate platformele, bazată pe executarea a mai multor procese de manipulare (implicit 3), în Linux poate fi utilizat interfața de intrare/ieșire asincronă io_uring (io_method=io_uring), suportată începând cu kernelul Linux 5.1. Intrarea/ieșirea asincronă este utilizată momentan doar pentru accelerarea anumitor operațiuni legate de citirea datelor din sistemul de fișiere, cum ar fi parcurgerea secvențială, scanarea hărții indexului și efectuarea curățării (vacuum). În unele teste, utilizarea AIO duce la o creștere a performanței de 2-3 ori. Operațiunile de scriere continuă să fie executate în mod sincron pentru a respecta cerințele ACID.
- A fost implementată optimizarea «skip scan» în indecșii multicolumnari, ceea ce permite utilizarea indexului nu doar pentru verificarea primei coloane indexate și a legăturii complete a coloanelor, ci și pentru procesarea individuală a celorlalte coloane indexate. De exemplu, anterior, atunci când se crea un index de tip B-tree pe coloanele „(status, date)”, indexul era aplicat doar pentru interogările care verificau câmpul „status” sau ambele câmpuri „status” și „date”, iar în cazul în care se verifica doar câmpul „date” se efectua scanarea conținutului tabelului. Modului „skip scan” permite, în anumite situații, scanarea indexului atunci când se interoghează doar câmpul „date”. Acest mod se aplică doar pentru indecșii de tip „B-tree” atunci când se utilizează în interogare operatorul condițional „=” pe câmpul indexat, în situațiile în care câmpul omis are un număr mic de valori distincte (de exemplu, optimizarea va funcționa dacă câmpul status „status” are câteva valori fixe).
- Au fost adăugate optimizări care utilizează mai eficient indexurile pentru interogări ce conțin construcții precum „OR” și „IN (…)” în blocul „WHERE”, precum și pentru îmbunătățirea performanței planificării și execuției unificării tabelelor (de exemplu, a fost accelerat codul pentru unificarea hash-urilor și s-a permis utilizarea sortării incrementale la unificarea tabelelor).
- A fost adăugat suportul pentru paralelizarea construcției indexurilor GIN (Index Invers Generalizat), aplicate pentru indexarea valorilor compuse, cum ar fi tablourile, și organizarea căutării pe date textuale complete sau structuri JSON.
- A fost implementată posibilitatea de a crea vizualizări materializate și chei pentru secționarea tabelelor cu indexuri ce au semnul „unic”, care nu utilizează structura B-tree.
- A fost crescută performanța generală a blocajelor pentru interogări care lucrează cu un număr mare de tabele, iar îmbunătățiri au fost aduse procesării interogărilor către tabelele secționate, accelerând eliminarea secțiunilor neutilizate și operațiunile de unificare (JOIN).
- Au fost accelerate operațiile cu text, cum ar fi funcțiile de conversie în litere mari/mici. A fost adăugat modul PG_UNICODE_FAST pentru a accelera contabilizarea proprietăților locale ale simbolurilor Unicode.
- A fost implementată posibilitatea de a salva statistica planificatorului de interogări după actualizare între versiuni semnificative ale PostgreSQL. Această modificare evită executarea operațiunii consumatoare de resurse „ANALYZE” după lansarea unei noi versiuni, până la finalizarea căreia se observă o scădere a performanței SGBD.
- A fost crescută performanța utilitarului pg_upgrade, utilizat pentru automatizarea tranziției la o nouă versiune semnificativă a PostgreSQL. Optimizările sunt deosebit de vizibile atunci când se actualizează o bază de date care conține un număr mare de obiecte, cum ar fi tabelele și secvențele. Pentru accelerarea funcționării pg_upgrade a fost adăugat și un flag „—jobs N” pentru paralelizarea verificărilor în N fire și un flag „—swap” pentru înlocuirea completă a directoarelor cu date, fără a crea linkuri, fără clonare și fără copierea fișierelor.
- A fost adăugat suportul pentru coloanele generate virtual, ale căror valori sunt calculate în timp real în timpul execuției interogărilor, fără a fi salvate pe disc. Dacă în expresia „CREATE TABLE…” pentru coloanele generate este specificat doar cuvântul cheie „GENERATED” fără precizarea tipului (STORED sau VIRTUAL), atunci noua variantă se aplică implicit în locul vechii implementări. În vechea implementare, valorile erau generate în timpul operațiunilor „INSERT” sau „UPDATE” și erau salvate pe disc pentru utilizări ulterioare. Dezavantajul coloanelor generate virtuale este imposibilitatea de a le utiliza în indecși, iar avantajul este capacitatea de a normaliza și modifica datele în timp real (relevant în lucrul cu date JSON). În ceea ce privește coloanele generate stocate clasice, în noua versiune s-a asigurat suportul pentru replica logică.
- În comenzile INSERT, UPDATE, DELETE și MERGE a fost implementată posibilitatea de a returna valorile anterioare (OLD) și cele curente (CURRENT) în expresia RETURNING. De exemplu, „UPDATE… RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.”.
- A fost adăugată funcția uuidv7() pentru generarea de identificatori unici aleatorii în format UUIDv7. Spre deosebire de vechea funcție pentru generarea UUID (gen_random_uuid), care acum este disponibilă și sub numele uuidv4(), în UUIDv7, pe lângă valoarea aleatorie, este inclus și timpul generării. Prezența părților ordonate în valoarea UUID (primele 12 caractere reprezentând timpul epoch, iar următoarele 18 fiind valoarea aleatorie) îmbunătățește eficiența sortării și indexării, ceea ce este relevant deoarece UUID-urile sunt utilizate de obicei pentru chei primare (de exemplu, cheile create într-un interval de timp apropiat sunt plasate una lângă alta în index).
- În operația „LIKE” a fost implementat suportul pentru potriviri cu text în care sunt utilizate proprietăți nedeterministe ale localei „collation”, permițând realizarea de potriviri care țin cont de semnificația simbolurilor (de exemplu, în comparație ar putea fi ignorat accentul). A fost adăugată funcția CASEFOLD pentru a modifica literele cu respectarea proprietăților localei „collation” (de exemplu, unele simboluri au mai multe variante minuscule sau, în comparație, necesită conversia în majuscule, nu în minuscule).
- A fost adăugată posibilitatea de a utiliza constrângeri temporale (temporal constraint). Pentru valorile „PRIMARY KEY” și „UNIQUE” de adăugare a constrângerilor temporale, trebuie folosită expresia „WITHOUT OVERLAPS”, iar pentru valoarea „FOREIGN KEY” — expresia PERIOD. De exemplu, atunci când se definesc cheile primare, cheile pot fi restricționate cu intervale de timp care se suprapun.
- A fost adăugată comanda „CREATE FOREIGN TABLE … LIKE command” pentru a crea un schemă de tabel extern pe baza definiției unui tabel local.
- A fost adăugat suport pentru conectarea la SGBD folosind autentificarea bazată pe OAUTH 2.0 cu utilizarea tokenului de acces în loc de parolă. Utilizarea OAUTH permite nu stocarea parolelor în BD, ci identificarea utilizatorilor prin servicii externe, precum și utilizarea funcționalităților precum autentificarea în doi pași și punctul unic de acces (SSO).
- A fost adăugată funcția ssl_tls13_ciphers(), prin care se poate determina lista algoritmilor de criptare admisi la conectarea folosind protocolul TLSv1.3.
- Suportul pentru autentificarea folosind algoritmul md5 pentru hashing-ul parolelor a fost trecut în categoria deprecate și planificate pentru eliminare. În loc de md5, se recomandă utilizarea algoritmului SCRAM (SCRAM-SHA-256), apărut în PostgreSQL 10. De asemenea, se observă implementarea suportului pentru autentificarea bazată pe SCRAM în timpul conectării prin postgres_fdw și dblink la servere externe PostgreSQL.
- La executarea operației „EXPLAIN ANALYZE” sunt furnizate informații despre numărul de operații de căutare în indici în timpul scanării indexului și numărul de accesări ale bufferelor în timpul executării interogării. Statistica despre CPU, jurnalul WAL și intensitatea operațiunilor de citire a fost inclusă în ieșirea „EXPLAIN ANALYZE VERBOSE”. În tabela pg_stat_all_tables au fost adăugate informații despre timpul petrecut în operația VACUUM și analiza tabelelor. Au fost furnizate statistici despre intensitatea I/O și încărcarea jurnalului WAL pe conexiuni individuale. În pg_stat_subscription_stats și în loguri, a fost adăugată informația cu diagnosticarea conflictelor în timpul operațiunilor de scriere în timpul replicării logice.
- În noile instalări, utilizarea sumelor de control pentru verificarea integrității datelor stocate este activată implicit. Pentru a anula acest comportament la pornirea initdb, trebuie specificată opțiunea „—no-data-checksums”.
- Utilitarul pg_createsubscriber a fost îmbogățit cu opțiunea „—all” pentru a crea replici logice dintr-o dată pentru toate bazele de date.
- A fost implementată o nouă versiune (3.2) a protocolului utilizat pentru interacțiunea utilitarilor externe cu SGBD-ul, realizat în biblioteca libpq. Ultima actualizare a protocolului a avut loc în PostgreSQL 7.4 (anul 2003). În biblioteca libpq, versiunea 3.0 continuă să fie utilizată ca default.
Sursa: opennet.ro
