Datenbank PostgreSQL 15 führt endlich MERGE ein
Neben dem fast überfälligen Kombibefehl MERGE bringt die Open-Source-Datenbank Erweiterungen für die logische Replikation und für JSON-Inhalte.
Nach einer fünfmonatigen Betaphase ist PostgreSQL 15 nun allgemein verfügbar. Bei den neuen Funktionen ist vor allem die SQL-Anweisung MERGE
nennenswert. Außerdem bringt die Open-Source-Datenbank Ergänzungen der logischen Replikation, für reguläre Ausdrücke und für JSON-Inhalte mit.
Komfortabel überführt mit Merge
Der Befehl MERGE
dient zum Überführen mehrerer Zeilen aus einer Quelle in eine Tabelle. Er kann die Befehle INSERT
, UPDATE
und DELETE
kombinieren. Im SQL-Standard ist er seit SQL:2003 zu finden.
Zum Start definiert MERGE
das Ziel mit INTO
und die Quelle mit USING
. Danach legt ON
eine Bedingung fest. Wenn diese erfüllt ist, gelten die Zeilen als übereinstimmend. Daraufhin gibt WHEN MATCHED
an, was passiert, wenn die Bedingung erfüllt ist. Eine typische Folge ist ein UPDATE
.
Analog dazu bestimmt WHEN NOT MATCHED
, wie die Datenbank mit Zeilen umgeht, die nicht im Ziel vorhanden sind. Dann könnte der Befehl sie über INSERT
einfügen:
MERGE INTO Ziel
USING Quelle
ON Bedingung
WHEN MATCHED THEN
...
WHEN NOT MATCHED THEN
...
Zusätzlich lässt sich eine Bedingung für das Löschen von Inhalten festlegen. Bisher ließ sich in PostgreSQL ein ähnliches Vorgehen zum MERGE
-Befehl nur mit Stored Procedures oder in eingeschränkter Form über INSERT .. ON CONFLICT
umsetzen, das ein UPDATE
als Konfliktbehandlung bei vorhandenen Zeilen definieren kann.
Mehr Anpassung bei der Replikation
Die logische Replikation bietet neuerdings erweiterte Optionen, um nur eine Auswahl zu replizieren. Dafür führt PostgreSQL 15 das Filtern nach Zeilen ein, und im Befehl CREATE PUBLICATION
lässt sich neuerdings eine Liste der zu übertragenden Spalten angeben. Außerdem erweitert das Release die Einstellungen für den Umgang mit Konflikten.
Neu ist der Parameter disable_on_error
, der das logische Replizieren bei einem Fehler abbricht. Außerdem lassen sich neuerdings nicht nur alle Tabellen einer Datenbank, sondern auch alle Tabellen eines Schemas bereitstellen.
Im Bereich der regulären Ausdrücke bringt Version 15 ebenfalls einige Ergänzungen mit: regexp_count
zählt die passenden Aufkommen und regexp_instr
liefert die Position des n-ten Treffers zurück. regexp_like
überprüft, ob ein regulärer Ausdruck in einem String vorhanden ist und gibt schlicht true
oder false
zurück. Schließlich gibt regexp_substr
entweder den Teil einer Zeichenkette zurück, auf den der reguläre Ausdruck passt, oder NULL
, falls es keine Übereinstimmung gibt.
Backups, Default-Schema und Performance
Nachdem die Vorversion für Backups die LZ4-Komprimierung eingeführt hat, bietet PostgreSQL 15 zusätzlich Zstandard (zstd). Das Backup-Utility für Cluster pg_basebackup
kann nun serverseitig mit Gzip, LZ4 oder zstd komprimieren.
Nennenswert ist zudem, dass User aus Sicherheitsgründen im public
beziehungsweise Default-Schema keine Tabellen mehr mit CREATE
erzeugen dürfen.
Wie üblich bringt das Release einige Performance-Optimierungen mit. Version 15 soll unter anderem große Datensätze deutlich schneller sortieren. Das gilt vor allem, wenn die Größe jenseits des im Parameter work_mem
gesetzten Wertes liegt, der die maximale Arbeitsspeichergröße für Query Workspaces angibt. Auch Fensterfunktionen, die row_number()
, rank()
oder count()
verwenden, sollen performanter laufen. Das Aufräumen selektierter Listen von Duplikaten über SELECT DISTINCT
arbeitet im aktuellen Release parallelisiert.
Weitere Neuerungen in PostgreSQL 15 lassen sich der Ankündigung entnehmen. Eine detaillierte Aufführung der Änderungen steht in den Release Notes. Binaries und der Link zum Sourcecode finden sich auf der Download-Seite.
Der Absatz zur JSON-Implementierung wurde herausgenommen, da JSON_TABLE
zwar in der Beta vorhanden war, es aber doch nicht in das GA-Release geschafft hat.
(rme)