Release der Datenbank PostgreSQL 18

Nach einem Jahr der Entwicklung wurde der neue stabile Branch der Datenbank PostgreSQL 18 veröffentlicht. Updates für den neuen Branch werden bis November 2030 über einen Zeitraum von fünf Jahren 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, das die Durchsatzrate für Input/Output erhöht und Verzögerungen beseitigt. Neben der auf allen Plattformen verfügbaren universellen Implementierung von AIO (io_method=worker), die auf der Ausführung mehrerer Handler-Prozesse basiert (standardmäßig 3), kann unter Linux das asynchrone I/O-Interface io_uring (io_method=io_uring) verwendet werden, das ab Kernelversion 5.1 unterstützt wird. Asynchrones I/O wird derzeit nur zur Beschleunigung bestimmter Operationen, die das Lesen von Daten aus dem Dateisystem betreffen, wie sequentielle Durchläufe, das Scannen von Index-Bitmaps und die Durchführung von Wartungsarbeiten (vacuum), eingesetzt. In einigen Tests führt die Verwendung von AIO zu einer Leistungssteigerung von 2-3 Mal. Schreiboperationen werden weiterhin im synchronen Modus ausgeführt, um die Anforderungen an ACID zu erfüllen.
  • Die Optimierung „Skip Scan“ in mehrspaltigen Indizes wurde implementiert, wodurch der Index nicht nur zur Überprüfung der ersten indizierten Spalte und vollständigen Verknüpfung von Spalten verwendet werden kann, sondern auch zur Verarbeitung der anderen indizierten Spalten einzeln. Beispielsweise wurde bei der Erstellung eines B-Tree-Indexes über die Spalten „(status, date)“ der Index nur für Abfragen angewendet, die das Feld „status“ oder beide Felder „status“ und „date“ überprüften, während beim Überprüfen nur des Feldes „date“ ein Scan des Tabelleninhalts durchgeführt wurde. Der Modus „Skip Scan“ ermöglicht es, den Index unter bestimmten Umständen bei einer Abfrage nur des Feldes „date“ zu scannen. Der Modus wird nur für „B-Tree“-Indizes verwendet, wenn in der Abfrage der bedingte Operator „=“ über dem indizierten Feld angewendet wird, in Situationen, in denen das übersprungene Feld nur wenige unterschiedliche Werte hat (zum Beispiel wirkt die Optimierung, wenn das Feld status „status“ mehrere feste Werte hat).
  • Optimierungen wurden hinzugefügt, die Indizes für Abfragen, die "OR"- und "IN (...)"- Konstruktionen im "WHERE"-Block enthalten, effektiver nutzen, sowie die Performance der Planung und Ausführung von Tabellenverknüpfungen (z. B. wurde der Code für Hash-Merges beschleunigt und es wurde ermöglicht, bei Tabellenverknüpfungen eine inkrementelle Sortierung zu verwenden).
  • Unterstützung für die Parallelisierung des Aufbaus von GIN-Indizes (Generalized Inverted Index) hinzugefügt, die zur Indizierung von zusammengesetzten Werten wie Arrays und zur Organisation der Volltextsuche oder JSON-Strukturen verwendet werden.
  • Die Möglichkeit zur Erstellung von materialisierten Sichten und Schlüsseln für die Partitionierung von Tabellen mit 'unique'-Indexstrukturen, die keine B-Baum-Struktur verwenden, wurde hinzugefügt.
  • Die allgemeine Leistung bei Sperren für Abfragen, die mit einer großen Anzahl von Tabellen arbeiten, wurde erhöht, und es wurden Verbesserungen bei der Verarbeitung von Abfragen an partitionierten Tabellen vorgenommen, die das Herausfiltern nicht verwendeter Abschnitte und JOIN-Operationen beschleunigen.
  • Textoperationen wie Funktionen zur Umwandlung in Groß-/Kleinschreibung wurden beschleunigt. Der Modus PG_UNICODE_FAST wurde hinzugefügt, um die Berücksichtigung der Eigenschaften von Unicode-Zeichenlokalen zu beschleunigen.
  • Die Möglichkeit zur Speicherung der Statistiken des Abfrageplaners nach einem Update zwischen bedeutenden Versionen von PostgreSQL wurde implementiert. Diese Änderung ermöglicht es, die ressourcenintensive Operation "ANALYZE" nach dem Start einer neuen Version zu vermeiden, da während dieser Zeit eine Leistungsminderung der DBMS zu beobachten ist.
  • Die Leistung des Tools pg_upgrade, das zur Automatisierung des Wechsels auf eine neue Hauptversion von PostgreSQL dient, wurde verbessert. Die Optimierungen sind besonders bei der Aktualisierung von Datenbanken mit einer großen Anzahl von Objekten wie Tabellen und Sequenzen spürbar. Um die Arbeit von pg_upgrade zu beschleunigen, wurde auch das Flag "—jobs N" zum Parallelisieren von Prüfungen in N Threads und das Flag "—swap" zum vollständigen Austausch von Datenverzeichnissen ohne Verlinkung, ohne Klonen und ohne Kopieren von Dateien hinzugefügt.
  • Es wurde Unterstützung für virtuelle generierte Spalten hinzugefügt, deren Werte zur Laufzeit bei 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 Angabe des Typs (STORED oder VIRTUAL) angegeben ist, wird die neue Variante standardmäßig anstelle der alten Implementierung angewendet. Bei 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. Der Nachteil von virtuellen generierten Spalten ist, dass sie nicht in Indizes verwendet werden können, während der Vorteil die Möglichkeit ist, Normalisierungen und Datenänderungen zur Laufzeit durchzuführen (aktuell bei der Arbeit mit JSON-Daten). Was klassische gespeicherte generierte 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 Ausdruck RETURNING 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 Format UUIDv7 zu generieren. Im Gegensatz zur alten Funktion zur Generierung von UUID (gen_random_uuid), die jetzt zusätzlich unter dem Namen uuidv4() verfügbar ist, umfasst bei UUIDv7 neben dem zufälligen Wert auch die Generierungszeit. Das Vorhandensein von geordneten Teilen im Wert der UUID (die ersten 12 Zeichen – epochale Zeit, und die folgenden 18 – Zufallswert) erhöht die Effizienz von Sortierung und Indizierung, was relevant ist, da UUIDs normalerweise für Primärschlüssel verwendet werden (zum Beispiel werden Schlüssel, die in naher Zeit erstellt wurden, in der Indizierung nahe beieinander platziert).
  • In der Operation „LIKE“ wurde die Unterstützung für Übereinstimmungen mit Text implementiert, bei denen nichtdeterministische Eigenschaften der Locale „collation“ verwendet werden, die es ermöglichen, Übereinstimmungen unter Berücksichtigung der Bedeutung von Symbolen durchzuführen (zum Beispiel kann bei Vergleichen das Zeichen der Betonung unberücksichtigt bleiben). Die Funktion CASEFOLD wurde hinzugefügt, um die Groß- und Kleinschreibung der Zeichen unter Berücksichtigung der Eigenschaften der Locale „collation“ zu ändern (zum Beispiel haben einige Zeichen mehr als zwei Kleinbuchstabenvarianten oder erfordern beim Vergleichen eine Umwandlung in Großbuchstaben, nicht in Kleinbuchstaben).
  • Die Möglichkeit zur Verwendung von zeitlichen Einschränkungen (temporal constraint) wurde hinzugefügt. Bei den Werten „PRIMARY KEY“ und „UNIQUE“ ist das Ausdruck „WITHOUT OVERLAPS“ für die Hinzufügung zeitlicher Einschränkungen zu verwenden, während für den Wert „FOREIGN KEY“ der Ausdruck PERIOD verwendet werden sollte. Zum Beispiel können bei der Definition von Primärschlüsseln Schlüssel mit überlappenden Zeitintervallen eingeschränkt werden.
  • Der Befehl „CREATE FOREIGN TABLE … LIKE command“ wurde hinzugefügt, um ein Schema einer externen Tabelle auf der Grundlage der Definition einer lokalen Tabelle zu erstellen.
  • Die Unterstützung für die Verbindung zu DBMS wurde hinzugefügt, indem die Authentifizierung auf der Basis von OAUTH 2.0 unter Verwendung eines Zugriffstokens anstelle eines Passworts genutzt wird. Die Verwendung von OAUTH ermöglicht es, Passwörter nicht in der Datenbank zu speichern und Benutzer über externe Dienste zu identifizieren, sowie Funktionen wie die Zwei-Faktor-Authentifizierung und Single Sign-On (SSO) zu nutzen.
  • Die Funktion ssl_tls13_ciphers() wurde hinzugefügt, mit der eine Liste von Verschlüsselungsalgorithmen angegeben werden kann, die bei einer Verbindung mit dem Protokoll TLSv1.3 zulässig sind.
  • Die Unterstützung für die Authentifizierung mit dem Algorithmus md5 zur Passwort-Hashierung wurde in die Kategorie der veralteten und zur Löschung vorgesehenen Funktionen eingestuft. Statt md5 wird empfohlen, den Algorithmus SCRAM (SCRAM-SHA-256) zu verwenden, der in PostgreSQL 10 eingeführt wurde. Zusätzlich wird die Implementierung der Unterstützung für die SCRAM-basierte Authentifizierung bei Verbindungen über postgres_fdw und dblink zu externen PostgreSQL-Servern hervorgehoben.
  • 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 Buffer beim Ausführen der Anfrage bereitgestellt. Die Ausgabe „EXPLAIN ANALYZE VERBOSE“ umfasst Statistiken über CPU, WAL-Log und die Intensität der Leseoperationen. In die Tabelle pg_stat_all_tables wurden Informationen über die für die VACUUM-Operation sowie die Analyse der Tabellen aufgewendete Zeit aufgenommen. Es werden Statistiken über die Intensität von Ein-/Ausgaben und die Belastung des WAL-Logs nach einzelnen Verbindungen bereitgestellt. In pg_stat_subscription_stats und in den Logs wurde Diagnoseninformation zu Konflikten bei der Durchführung von Schreiboperationen während der logischen Replikation hinzugefügt.
  • In neuen Installationen ist die Verwendung von Prüfziffern zur Überprüfung der Integrität der gespeicherten Daten standardmäßig aktiviert. Um dieses Verhalten beim Start von initdb zu deaktivieren, sollte die Option „—no-data-checksums“ angegeben werden.
  • In das Dienstprogramm pg_createsubscriber wurde die Flagge „—all“ hinzugefügt, um logische Replikate mit einem einzigen Befehl für alle Datenbanken zu erstellen.
  • Eine neue Version (3.2) des Protokolls wurde implementiert, das für die Interaktion externer Dienstprogramme mit der DBMS verwendet wird und in der Bibliothek libpq implementiert ist. Das letzte Update des Protokolls erfolgte in PostgreSQL 7.4 (2003). In der Bibliothek libpq wird standardmäßig weiterhin Version 3.0 verwendet.

Quelle: opennet.ru

60GB SSD 8Gb DDR4