Nach einem Jahr Entwicklung wurde der neue stabile Branch des DBMS PostgreSQL 18 veröffentlicht. Updates für den neuen Branch werden über einen Zeitraum von fünf Jahren bis November 2030 bereitgestellt. Der Support für PostgreSQL 13.x, den ältesten unterstützten Branch, wird am 13. November eingestellt.
Hauptneuheiten:
- Ein subsystem für asynchronen Input/Output wurde hinzugefügt, um die Durchsatzkapazität zu erhöhen und Verzögerungen zu vermeiden. Neben der plattformübergreifenden universellen AIO-Implementierung (io_method=worker), die auf mehreren Prozess-Handlern basiert (standardmäßig 3), kann auf Linux auch die Schnittstelle für asynchronen Input/Output io_uring (io_method=io_uring) verwendet werden, die ab Kernelversion 5.1 unterstützt wird. Aktuell wird asynchroner Input/Output nur zur Beschleunigung bestimmter Operationen verwendet, die mit dem Lesen von Daten aus dem Dateisystem zusammenhängen, wie sequentielle Durchläufe, das Scannen von Index-Bitmaps und die Durchführung von Reinigungen (vacuum). In einigen Tests führt die Anwendung von AIO zu einer Leistungssteigerung um das 2- bis 3-Fache. Schreiboperationen werden weiterhin synchron verarbeitet, um die Anforderungen an die ACID-Eigenschaften zu erfüllen.
- Die "Skip-Scan"-Optimierung in mehrspaltigen Indizes wurde implementiert. Dadurch kann der Index nicht nur zur Überprüfung der ersten indizierten Spalte und der vollständigen Verknüpfung von Spalten verwendet werden, sondern auch für die separate Verarbeitung der übrigen indizierten Spalten. Zum Beispiel wurde beim Erstellen eines B-Tree-Index für die Spalten "(status, date)" der Index zuvor nur für Abfragen angewendet, die das Feld "status" oder beide Felder "status" und "date" überprüften. Wurde jedoch in der Abfrage nur das Feld "date" überprüft, musste der Tabelleninhalt durchsucht werden. Der "Skip-Scan"-Modus ermöglicht es unter bestimmten Umständen, den Index bei der Abfrage nur für das Feld "date" zu nutzen. Diese Methode wird nur für "B-Tree"-Indizes angewandt, wenn in der Abfrage der Vergleichsoperator "=" über das indizierte Feld verwendet wird, insbesondere in Situationen, in denen das übersprungene Feld nur eine geringe Anzahl verschiedener Werte hat (zum Beispiel wird die Optimierung wirksam, wenn das Feld "status" eine begrenzte Anzahl fester Werte aufweist).
- Optimierungen wurden hinzugefügt, die die Indizes für Abfragen, die Konstruktionen wie «OR» und «IN (…)» im «WHERE»-Block enthalten, effektiver nutzen. Darüber hinaus wurde die Leistung bei der Planung und Ausführung von JOIN-Operationen verbessert, beispielsweise wurde der Hash-Merge-Code beschleunigt und die inkrementelle Sortierung beim Mergen von Tabellen aktiviert.
- Die Unterstützung für das Parallelisieren des Aufbaus von GIN-Indizes (Generalized Inverted Index), die zur Indizierung komplexer Werte wie Arrays verwendet werden, sowie zur Organisation der Volltextsuche oder für JSON-Strukturen wurde hinzugefügt.
- Die Möglichkeit zur Erstellung von materialisierten Sichten und Schlüsseln für die Partitionierung von Tabellen mit Indizes, die das Attribut «unique» haben und nicht die B-Baum-Struktur verwenden, wurde hinzugefügt.
- Die allgemeine Leistung von Locks für Abfragen, die mit einer großen Anzahl von Tabellen arbeiten, wurde verbessert. Außerdem wurden Verbesserungen in der Verarbeitung von Abfragen an partitionierte Tabellen vorgenommen, die das Herausfiltern von nicht verwendeten Partitionen und die JOIN-Operationen beschleunigen.
- Textoperationen wie die Umwandlung in Groß- oder Kleinschreibung wurden beschleunigt. Der Modus PG_UNICODE_FAST wurde hinzugefügt, um die Berücksichtigung von Unicode-Zeicheneigenschaften zu beschleunigen.
- Es wurde die Möglichkeit implementiert, Statistiken des Anfrageplaners nach einem Update zwischen bedeutenden Versionen von PostgreSQL zu speichern. Diese Änderung ermöglicht es, die ressourcenintensive Operation "ANALYZE" zu vermeiden, die nach dem Start einer neuen Version ausgeführt wird und zu einem Leistungseinbruch des DBMS führt.
- Die Leistung des Tools pg_upgrade, das für die Automatisierung des Wechsels zu einem neuen Hauptrelease von PostgreSQL verwendet wird, wurde verbessert. Die Optimierungen sind besonders bemerkbar, wenn Datenbanken aktualisiert werden, die eine große Anzahl von Objekten wie Tabellen und Sequenzen enthalten. Um die Arbeiten von pg_upgrade zu beschleunigen, wurden auch die Flags "—jobs N" für die Parallelisierung der Prüfungen in N Threads und "—swap" hinzugefügt, um Datenverzeichnisse vollständig ohne Verlinkungen, Klonierungen oder Datei-Kopierungen auszutauschen.
- Die Unterstützung für virtuellen generierten Spalten wurde hinzugefügt, deren Werte zur Laufzeit während der Ausführung von Abfragen berechnet werden, ohne auf der Festplatte gespeichert zu werden. Wenn im Ausdruck „CREATE TABLE…“ für generierte Spalten nur das Schlüsselwort „GENERATED“ ohne Spezifizierung des Typs (STORED oder VIRTUAL) angegeben wird, gilt die neue Variante standardmäßig anstelle der alten Implementierung. In der alten Implementierung wurden die Werte während der Ausführung von „INSERT“- oder „UPDATE“-Operationen generiert und auf der Festplatte für die spätere Verwendung gespeichert. Ein Nachteil der virtuellen generierten Spalten ist die Unmöglichkeit, sie in Indizes zu verwenden, während ein Vorteil darin besteht, dass die Normalisierung und Datenänderung zur Laufzeit möglich ist (besonders relevant bei der Arbeit mit JSON-Daten). Was die klassischen gespeicherten generierten Spalten betrifft, so wurde in der neuen Version die Unterstützung für logische Replikation sichergestellt.
- In den Befehlen INSERT, UPDATE, DELETE und MERGE wurde die Möglichkeit implementiert, frühere (OLD) und aktuelle (CURRENT) Werte im RETURNING-Ausdruck auszugeben. Zum Beispiel: „UPDATE… RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.”
- Die Funktion uuidv7() wurde hinzugefügt, um zufällige eindeutige Bezeichner im UUIDv7-Format zu generieren. Im Gegensatz zur vorherigen Funktion zur UUID-Erstellung (gen_random_uuid), die jetzt zusätzlich unter dem Namen uuidv4() verfügbar ist, berücksichtigt UUIDv7 neben dem zufälligen Wert auch den Zeitstempel der Erstellung. Die sortierbaren Teile im UUID-Wert (die ersten 12 Zeichen repräsentieren die Epochennummer, gefolgt von 18 Zeichen für den Zufallswert) verbessern die Effizienz von Sortierung und Indizierung, was besonders relevant ist, da UUIDs häufig als Primärschlüssel verwendet werden (z. B. werden Schlüssel, die zur gleichen Zeit erstellt wurden, näher zusammen im Index platziert).
- In der 'LIKE'-Operation wurde die Unterstützung für Textübereinstimmungen implementiert, die unsichere Locale-Eigenschaften 'collation' verwenden, die es ermöglichen, Übereinstimmungen unter Berücksichtigung der Bedeutung von Zeichen durchzuführen (z. B. kann die Akzentuierung bei Vergleichen ignoriert werden). Die Funktion CASEFOLD wurde hinzugefügt, um die Groß- und Kleinschreibung von Zeichen basierend auf den 'collation'-Eigenschaften zu ändern (z. B. haben einige Zeichen mehr als zwei Kleinbuchstaben-Varianten oder erfordern bei Vergleichen die Umwandlung in Großbuchstaben anstelle von Kleinbuchstaben).
- Die Möglichkeit, zeitliche Einschränkungen (temporal constraint) zu verwenden, wurde hinzugefügt. Bei den Werten „PRIMARY KEY“ und „UNIQUE“ sollten zur Hinzufügung zeitlicher Einschränkungen die Ausdrücke „WITHOUT OVERLAPS“ verwendet werden, während bei „FOREIGN KEY“ der Ausdruck PERIOD Anwendung finden sollte. So lässt sich beispielsweise bei der Definition von Primärschlüsseln erreichen, dass sich die Schlüssel nicht überlappende Zeitintervalle teilen.
- Der Befehl „CREATE FOREIGN TABLE … LIKE command“ wurde hinzugefügt, um ein Schema für eine externe Tabelle basierend auf der Definition einer lokalen Tabelle zu erstellen.
- Die Unterstützung für die Verbindung zu Datenbanksystemen unter Verwendung von OAUTH 2.0-Authentifizierung mit einem Zugriffstoken anstelle eines Passworts wurde hinzugefügt. Durch die Anwendung von OAUTH ist es möglich, Passwörter nicht in der Datenbank zu speichern, Benutzer über externe Dienste zu identifizieren und Funktionen wie die Zwei-Faktor-Authentifizierung und ein Single Sign-On (SSO) zu nutzen.
- Die Funktion ssl_tls13_ciphers() wurde hinzugefügt, über die die Liste der erlaubten Verschlüsselungsalgorithmen bei der Verbindung mit dem Protokoll TLSv1.3 definiert werden kann.
- Die Unterstützung für die Authentifizierung mit dem MD5-Algorithmus zur Passwort-Hashung wurde als veraltet und zur Entfernung vorgesehen eingestuft. Anstelle von MD5 wird empfohlen, den SCRAM-Algorithmus (SCRAM-SHA-256) zu verwenden, der in PostgreSQL 10 eingeführt wurde. Hinzu kommt die Implementierung der Unterstützung für die SCRAM-basierte Weiterleitung der Authentifizierung beim Anschluss über postgres_fdw und dblink an externe PostgreSQL-Server.
- Bei der Ausführung der Operation „EXPLAIN ANALYZE“ werden Informationen über die Anzahl der Suchoperationen in Indizes während des Index-Scans und die Anzahl der Zugriffe auf die Puffer bei der Ausführung der Abfrage ausgegeben. Die Ausgabe von „EXPLAIN ANALYZE VERBOSE“ umfasst Statistiken zur CPU-Nutzung, zum WAL-Protokoll und zur Intensität der Lesevorgänge. Zur Tabelle pg_stat_all_tables wurden Informationen über die Zeit, die für die VACUUM-Operation und die Analyse der Tabellen aufgewendet wurde, hinzugefügt. Es werden Statistiken zur Ein-/Ausgabeintensität und zur Belastung des WAL-Protokolls je Verbindung bereitgestellt. In pg_stat_subscription_stats und in den Logs sind Informationen zur Diagnose von Konflikten während von Schreibvorgängen bei der logischen Replikation hinzugefügt worden.
- In den neuen Installationen ist die Verwendung von Prüfziffern zur Überprüfung der Integrität gespeicherter Daten standardmäßig aktiviert. Um dieses Verhalten beim Start von initdb abzubrechen, sollte die Option „—no-data-checksums“ angegeben werden.
- Der Flag „—all“ wurde im Tool pg_createsubscriber hinzugefügt, um logische Replikate sofort für alle Datenbanken mit einem Befehl zu erstellen.
- Eine neue Version (3.2) des Protokolls, das für die Interaktion externer Tools mit der Datenbankmanagement-Software und in der Bibliothek libpq implementiert ist, wurde eingeführt. Das letzte Protokoll-Update fand in PostgreSQL 7.4 (2003) statt. In der Bibliothek libpq wird weiterhin standardmäßig die Version 3.0 verwendet.
Quelle: opennet.ru
