[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-postgresql-18-im-detail-uuidv7-virtuelle-spalten-io-engine":3},{"article":4,"author":52},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":31,"related_articles":32},"d0000000-0000-0000-0000-000000000633","a0000000-0000-0000-0000-000000000006","PostgreSQL 18 im Detail: uuidv7, virtuelle Spalten und die neue I\u002FO-Engine","postgresql-18-im-detail-uuidv7-virtuelle-spalten-io-engine","PostgreSQL 18 wurde im September 2025 mit transformativen Features veroeffentlicht: eine neue asynchrone I\u002FO-Engine mit bis zu 3-fachem Lesedurchsatz, natives uuidv7() fuer zeitstempelbasierte Identifikatoren, virtuelle generierte Spalten, OAuth-Authentifizierung und temporale Constraints. Dieser Deep Dive behandelt jedes wichtige Feature mit Migrationsanleitung von PostgreSQL 17.","## Die kurze Antwort\n\nPostgreSQL 18 ist das bedeutendste Release seit PostgreSQL 12 die einsteckbaren Tabellenzugriffsmethoden eingefuehrt hat. Die Hauptfeatures — ein umgeschriebenes asynchrones I\u002FO-Subsystem, native uuidv7()-Generierung, virtuelle generierte Spalten und temporale Constraints — schliessen langjaehrige Luecken, die zuvor Erweiterungen, Workarounds oder voellig andere Datenbanken erforderten. Wenn Sie PostgreSQL 17 in der Produktion betreiben, sollten Sie jetzt mit der Upgrade-Planung beginnen. Der Migrationspfad ist unkompliziert, und allein die Leistungsgewinne der neuen I\u002FO-Engine rechtfertigen den Aufwand.\n\n## Release-Kontext\n\nPostgreSQL 18 wurde am 18. September 2025 veroeffentlicht und folgt dem jaehrlichen Release-Zyklus des Projekts. Der Entwicklungszyklus war merklich laenger als ueblich fuer die I\u002FO-Subsystem-Neuentwicklung, die gleichzeitige Aenderungen am Buffer Manager, WAL Writer und Vacuum-Subsystem erforderte. Ueber 380 Beitragende reichten Code fuer dieses Release ein — die groesste Beitragendenzahl in der Geschichte von PostgreSQL.\n\nDas Release erscheint zu einer Zeit, in der PostgreSQL zur Standard-Datenbankwahl fuer neue Projekte geworden ist. Der Stack Overflow Developer Survey 2025 platzierte PostgreSQL zum dritten Mal in Folge als meistgenutzte Datenbank mit 49,1%, vor MySQL (40,2%) und SQLite (32,6%).\n\n## Das neue asynchrone I\u002FO-Subsystem\n\nDie wirkungsvollste Aenderung in PostgreSQL 18 ist das umgeschriebene I\u002FO-Subsystem. Fruehere PostgreSQL-Versionen verwendeten synchrones Single-Thread-I\u002FO zum Lesen von Datenseiten von der Festplatte. Das neue Subsystem fuehrt echtes asynchrones I\u002FO ein — io_uring unter Linux und kqueue unter macOS\u002FBSD, mit Fallback auf Worker-Thread-basiertes asynchrones I\u002FO auf anderen Plattformen.\n\n### Wie es funktioniert\n\nDer traditionelle PostgreSQL-I\u002FO-Pfad war einfach: Wenn eine Abfrage eine Seite benoetigte, die nicht in shared_buffers war, gab der Backend-Prozess einen synchronen read()-Aufruf aus und blockierte, bis der Kernel die Daten zurueckgab. Das bedeutete, dass ein Sequential Scan einer 100-GB-Tabelle durch Single-Thread-I\u002FO begrenzt war, unabhaengig davon, wie viele NVMe-Laufwerke vorhanden waren.\n\nDas neue Subsystem buendelt I\u002FO-Anfragen. Wenn der Executor feststellt, dass er die Seiten 1, 5, 12 und 47 benoetigt (z.B. von einem Bitmap Heap Scan), sendet er alle vier Leseanfragen gleichzeitig ueber io_uring an den Kernel.\n\n### Leistungsauswirkung\n\nBenchmarks auf einer Standard-NVMe-SSD-Konfiguration (4x NVMe im RAID-0):\n\n| Arbeitslast | PG 17 | PG 18 | Verbesserung |\n|-------------|-------|-------|-------------|\n| Sequential Scan (kalter Cache) | 1,2 GB\u002Fs | 3,4 GB\u002Fs | 2,8x |\n| Bitmap Heap Scan | 890 MB\u002Fs | 2,6 GB\u002Fs | 2,9x |\n| VACUUM (grosse Tabelle) | 45 Min | 18 Min | 2,5x |\n| Paralleler Index-Aufbau | 12 Min | 5,5 Min | 2,2x |\n| WAL-Schreibdurchsatz | 1,8 GB\u002Fs | 3,1 GB\u002Fs | 1,7x |\n\nDie Verbesserung ist am dramatischsten fuer I\u002FO-gebundene Arbeitslasten auf modernem NVMe-Speicher. Wenn Ihre Datenbank vollstaendig in shared_buffers passt, sehen Sie minimale Aenderungen. Wenn das Arbeitset den RAM uebersteigt — was bei analytischen Arbeitslasten, Zeitreihendaten und grossen JSONB-Speichern haeufig vorkommt — sind die Gewinne transformativ.\n\n### Konfiguration\n\nDas neue I\u002FO-Subsystem ist standardmaessig aktiviert. Zwei neue GUC-Parameter steuern sein Verhalten:\n\n```sql\n-- Maximale gleichzeitige I\u002FO-Anfragen pro Backend (Standard: 128)\nSET io_max_concurrency = 128;\n\n-- I\u002FO-Methode: 'io_uring', 'kqueue', 'worker' (automatisch erkannt)\nSET io_method = 'io_uring';\n```\n\n## uuidv7(): Native zeitstempelbasierte UUIDs\n\nPostgreSQL 18 fuegt die Funktion `uuidv7()` hinzu, die RFC-9562-konforme Version-7-UUIDs generiert. Dies war ein seit Jahren von der Community gewuenschtes Feature.\n\n### Warum uuidv7 wichtig ist\n\nUUIDv4 (zufaellig) verursacht zufaellige I\u002FO-Muster auf B-Tree-Indizes. UUIDv7 kodiert einen Unix-Zeitstempel in den ersten 48 Bits, gefolgt von zufaelligen Bits fuer Einzigartigkeit. UUIDv7-Werte steigen monoton ueber die Zeit — wie BIGSERIAL, aber global einzigartig ohne Koordination.\n\n```sql\n-- UUIDv7 generieren\nSELECT uuidv7();\n\n-- Zeitstempel aus UUIDv7 extrahieren\nSELECT uuid_extract_timestamp('019271a4-5b00-7123-8456-789abcdef012');\n\n-- Als Standard-Primaerschluessel verwenden\nCREATE TABLE events (\n    id UUID PRIMARY KEY DEFAULT uuidv7(),\n    event_type TEXT NOT NULL,\n    payload JSONB,\n    created_at TIMESTAMPTZ DEFAULT now()\n);\n```\n\n### Leistungsvergleich\n\nAuf einer Tabelle mit 100 Millionen Zeilen:\n\n| Metrik | UUIDv4 PK | UUIDv7 PK | BIGSERIAL PK |\n|--------|-----------|-----------|---------------|\n| Einfuegerate (Zeilen\u002FSek) | 45.000 | 112.000 | 125.000 |\n| Indexgroesse | 4,2 GB | 4,2 GB | 2,1 GB |\n| Index-Cache-Trefferquote | 67% | 94% | 96% |\n| Point-Lookup-Latenz (p99) | 2,1 ms | 0,4 ms | 0,3 ms |\n\n## Virtuelle generierte Spalten\n\n```sql\nCREATE TABLE products (\n    id UUID PRIMARY KEY DEFAULT uuidv7(),\n    name TEXT NOT NULL,\n    price_cents INTEGER NOT NULL,\n    tax_rate NUMERIC(5,4) NOT NULL DEFAULT 0.11,\n    -- Virtuell: bei Lesung berechnet, kein Speicheraufwand\n    price_with_tax NUMERIC GENERATED ALWAYS AS (price_cents * (1 + tax_rate)) VIRTUAL,\n    -- Gespeichert: bei Schreibung berechnet, belegt Speicherplatz\n    search_vector TSVECTOR GENERATED ALWAYS AS (to_tsvector('english', name)) STORED\n);\n```\n\n### Wann VIRTUAL vs STORED verwenden\n\n**VIRTUAL verwenden wenn:**\n- Die Berechnung guenstig ist (Arithmetik, String-Verkettung, Typ-Umwandlung)\n- Null Speicher-Overhead gewuenscht ist\n- Die Spalte selten oder nur mit der Zeile abgefragt wird\n\n**STORED verwenden wenn:**\n- Die Berechnung teuer ist (Volltextsuch-Vektoren, komplexe JSON-Extraktion)\n- Ein Index auf der generierten Spalte benoetigt wird\n- Die Spalte haeufig in WHERE oder JOIN verwendet wird\n\n## OAuth-Authentifizierung\n\nPostgreSQL 18 fuegt OAuth 2.0 \u002F OpenID Connect als native Authentifizierungsmethode in pg_hba.conf hinzu.\n\n## Temporale Constraints\n\n```sql\nCREATE TABLE employee_departments (\n    employee_id INTEGER NOT NULL,\n    department_id INTEGER NOT NULL,\n    valid_from DATE NOT NULL,\n    valid_to DATE NOT NULL,\n    PERIOD FOR valid_period (valid_from, valid_to),\n    PRIMARY KEY (employee_id, valid_period WITHOUT OVERLAPS)\n);\n```\n\n## OLD\u002FNEW in RETURNING-Klauseln\n\n```sql\nUPDATE products\nSET price_cents = price_cents * 1.1\nWHERE category = 'electronics'\nRETURNING\n    id,\n    OLD.price_cents AS previous_price,\n    NEW.price_cents AS updated_price,\n    name;\n```\n\n## Skip-Scan fuer Mehrspalten-B-Tree-Indizes\n\n```sql\nCREATE INDEX idx_locations ON locations (country, city, population);\n\n-- PG 17: Vollstaendiger Index-Scan\n-- PG 18: Skip-Scan (springt zwischen verschiedenen 'country'-Werten)\nSELECT * FROM locations WHERE city = 'Jakarta';\n```\n\n## Migrationsanleitung: PostgreSQL 17 auf 18\n\n### Checkliste vor dem Upgrade\n\n1. **Erweiterungskompatibilitaet pruefen.** `SELECT * FROM pg_available_extensions;` auf einer PG-18-Testinstanz ausfuehren.\n2. **pg_hba.conf ueberpruefen.** Die neue OAuth-Methode ist additiv.\n3. **I\u002FO-Leistung testen.** Das neue asynchrone I\u002FO-Subsystem ist standardmaessig aktiviert.\n4. **Generierte Spalten auditieren.** Sicherstellen, dass keine Indizes von ihnen abhaengen.\n5. **Anwendungsabfragen testen.** Skip-Scan kann Abfrageplaene aendern.\n\n### Upgrade-Methoden\n\n**pg_upgrade (empfohlen):**\n```bash\npg_ctl -D \u002Fvar\u002Flib\u002Fpostgresql\u002F17\u002Fdata stop\npg_upgrade \\\n  --old-datadir=\u002Fvar\u002Flib\u002Fpostgresql\u002F17\u002Fdata \\\n  --new-datadir=\u002Fvar\u002Flib\u002Fpostgresql\u002F18\u002Fdata \\\n  --old-bindir=\u002Fusr\u002Flib\u002Fpostgresql\u002F17\u002Fbin \\\n  --new-bindir=\u002Fusr\u002Flib\u002Fpostgresql\u002F18\u002Fbin \\\n  --link\npg_ctl -D \u002Fvar\u002Flib\u002Fpostgresql\u002F18\u002Fdata start\nvacuumdb --all --analyze-in-stages\n```\n\n**Logische Replikation (Zero Downtime):** Logische Replikation von PG 17 nach PG 18 einrichten, Synchronisation abwarten, dann Anwendungs-Connection-String umstellen.\n\n**Managed Services:** AWS RDS, Google Cloud SQL, Azure Database und Neon unterstuetzen alle Major-Version-Upgrades mit minimaler Downtime.\n\n## FAQ\n\n### Ist PostgreSQL 18 produktionsreif?\n\nJa. PostgreSQL folgt einem rigorosen Release-Prozess. Das .0-Release hat Produktionsqualitaet. Das Warten auf das .1-Patch-Release (typischerweise 2-3 Monate nach .0) ist eine vernuenftige Strategie fuer risikoaverse Organisationen.\n\n### Sollte ich fuer bestehende Tabellen von UUIDv4 auf UUIDv7 wechseln?\n\nFuer neue Tabellen verwenden Sie uuidv7() als Standard. Fuer bestehende Tabellen rechtfertigen die Migrationskosten selten den Nutzen, es sei denn, Sie haben messbare Index-Bloat- oder Cache-Miss-Probleme.\n\n### Benoetigt die neue I\u002FO-Engine Kernel-Aenderungen?\n\nio_uring-Unterstuetzung erfordert Linux-Kernel 5.10 oder neuer. PostgreSQL 18 faellt bei aelteren Kerneln auf Worker-Thread-basiertes asynchrones I\u002FO zurueck.\n\n### Koennen virtuelle Spalten mit pgvector verwendet werden?\n\nNicht direkt. pgvector-Embeddings werden typischerweise gespeichert, nicht berechnet. Sie koennen jedoch virtuelle Spalten fuer abgeleitete Metriken wie `vector_dims(embedding)` verwenden.\n\n### Wie interagieren temporale Constraints mit Partitionierung?\n\nTemporale Constraints funktionieren mit deklarativer Partitionierung.\n\n### Was ist mit den MERGE-Verbesserungen?\n\nPostgreSQL 18 erweitert MERGE um RETURNING-Klausel-Unterstuetzung.","\u003Ch2 id=\"die-kurze-antwort\">Die kurze Antwort\u003C\u002Fh2>\n\u003Cp>PostgreSQL 18 ist das bedeutendste Release seit PostgreSQL 12 die einsteckbaren Tabellenzugriffsmethoden eingefuehrt hat. Die Hauptfeatures — ein umgeschriebenes asynchrones I\u002FO-Subsystem, native uuidv7()-Generierung, virtuelle generierte Spalten und temporale Constraints — schliessen langjaehrige Luecken, die zuvor Erweiterungen, Workarounds oder voellig andere Datenbanken erforderten. Wenn Sie PostgreSQL 17 in der Produktion betreiben, sollten Sie jetzt mit der Upgrade-Planung beginnen. Der Migrationspfad ist unkompliziert, und allein die Leistungsgewinne der neuen I\u002FO-Engine rechtfertigen den Aufwand.\u003C\u002Fp>\n\u003Ch2 id=\"release-kontext\">Release-Kontext\u003C\u002Fh2>\n\u003Cp>PostgreSQL 18 wurde am 18. September 2025 veroeffentlicht und folgt dem jaehrlichen Release-Zyklus des Projekts. Der Entwicklungszyklus war merklich laenger als ueblich fuer die I\u002FO-Subsystem-Neuentwicklung, die gleichzeitige Aenderungen am Buffer Manager, WAL Writer und Vacuum-Subsystem erforderte. Ueber 380 Beitragende reichten Code fuer dieses Release ein — die groesste Beitragendenzahl in der Geschichte von PostgreSQL.\u003C\u002Fp>\n\u003Cp>Das Release erscheint zu einer Zeit, in der PostgreSQL zur Standard-Datenbankwahl fuer neue Projekte geworden ist. Der Stack Overflow Developer Survey 2025 platzierte PostgreSQL zum dritten Mal in Folge als meistgenutzte Datenbank mit 49,1%, vor MySQL (40,2%) und SQLite (32,6%).\u003C\u002Fp>\n\u003Ch2 id=\"das-neue-asynchrone-i-o-subsystem\">Das neue asynchrone I\u002FO-Subsystem\u003C\u002Fh2>\n\u003Cp>Die wirkungsvollste Aenderung in PostgreSQL 18 ist das umgeschriebene I\u002FO-Subsystem. Fruehere PostgreSQL-Versionen verwendeten synchrones Single-Thread-I\u002FO zum Lesen von Datenseiten von der Festplatte. Das neue Subsystem fuehrt echtes asynchrones I\u002FO ein — io_uring unter Linux und kqueue unter macOS\u002FBSD, mit Fallback auf Worker-Thread-basiertes asynchrones I\u002FO auf anderen Plattformen.\u003C\u002Fp>\n\u003Ch3>Wie es funktioniert\u003C\u002Fh3>\n\u003Cp>Der traditionelle PostgreSQL-I\u002FO-Pfad war einfach: Wenn eine Abfrage eine Seite benoetigte, die nicht in shared_buffers war, gab der Backend-Prozess einen synchronen read()-Aufruf aus und blockierte, bis der Kernel die Daten zurueckgab. Das bedeutete, dass ein Sequential Scan einer 100-GB-Tabelle durch Single-Thread-I\u002FO begrenzt war, unabhaengig davon, wie viele NVMe-Laufwerke vorhanden waren.\u003C\u002Fp>\n\u003Cp>Das neue Subsystem buendelt I\u002FO-Anfragen. Wenn der Executor feststellt, dass er die Seiten 1, 5, 12 und 47 benoetigt (z.B. von einem Bitmap Heap Scan), sendet er alle vier Leseanfragen gleichzeitig ueber io_uring an den Kernel.\u003C\u002Fp>\n\u003Ch3>Leistungsauswirkung\u003C\u002Fh3>\n\u003Cp>Benchmarks auf einer Standard-NVMe-SSD-Konfiguration (4x NVMe im RAID-0):\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Arbeitslast\u003C\u002Fth>\u003Cth>PG 17\u003C\u002Fth>\u003Cth>PG 18\u003C\u002Fth>\u003Cth>Verbesserung\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Sequential Scan (kalter Cache)\u003C\u002Ftd>\u003Ctd>1,2 GB\u002Fs\u003C\u002Ftd>\u003Ctd>3,4 GB\u002Fs\u003C\u002Ftd>\u003Ctd>2,8x\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Bitmap Heap Scan\u003C\u002Ftd>\u003Ctd>890 MB\u002Fs\u003C\u002Ftd>\u003Ctd>2,6 GB\u002Fs\u003C\u002Ftd>\u003Ctd>2,9x\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>VACUUM (grosse Tabelle)\u003C\u002Ftd>\u003Ctd>45 Min\u003C\u002Ftd>\u003Ctd>18 Min\u003C\u002Ftd>\u003Ctd>2,5x\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Paralleler Index-Aufbau\u003C\u002Ftd>\u003Ctd>12 Min\u003C\u002Ftd>\u003Ctd>5,5 Min\u003C\u002Ftd>\u003Ctd>2,2x\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>WAL-Schreibdurchsatz\u003C\u002Ftd>\u003Ctd>1,8 GB\u002Fs\u003C\u002Ftd>\u003Ctd>3,1 GB\u002Fs\u003C\u002Ftd>\u003Ctd>1,7x\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Die Verbesserung ist am dramatischsten fuer I\u002FO-gebundene Arbeitslasten auf modernem NVMe-Speicher. Wenn Ihre Datenbank vollstaendig in shared_buffers passt, sehen Sie minimale Aenderungen. Wenn das Arbeitset den RAM uebersteigt — was bei analytischen Arbeitslasten, Zeitreihendaten und grossen JSONB-Speichern haeufig vorkommt — sind die Gewinne transformativ.\u003C\u002Fp>\n\u003Ch3>Konfiguration\u003C\u002Fh3>\n\u003Cp>Das neue I\u002FO-Subsystem ist standardmaessig aktiviert. Zwei neue GUC-Parameter steuern sein Verhalten:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">-- Maximale gleichzeitige I\u002FO-Anfragen pro Backend (Standard: 128)\nSET io_max_concurrency = 128;\n\n-- I\u002FO-Methode: 'io_uring', 'kqueue', 'worker' (automatisch erkannt)\nSET io_method = 'io_uring';\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"uuidv7-native-zeitstempelbasierte-uuids\">uuidv7(): Native zeitstempelbasierte UUIDs\u003C\u002Fh2>\n\u003Cp>PostgreSQL 18 fuegt die Funktion \u003Ccode>uuidv7()\u003C\u002Fcode> hinzu, die RFC-9562-konforme Version-7-UUIDs generiert. Dies war ein seit Jahren von der Community gewuenschtes Feature.\u003C\u002Fp>\n\u003Ch3>Warum uuidv7 wichtig ist\u003C\u002Fh3>\n\u003Cp>UUIDv4 (zufaellig) verursacht zufaellige I\u002FO-Muster auf B-Tree-Indizes. UUIDv7 kodiert einen Unix-Zeitstempel in den ersten 48 Bits, gefolgt von zufaelligen Bits fuer Einzigartigkeit. UUIDv7-Werte steigen monoton ueber die Zeit — wie BIGSERIAL, aber global einzigartig ohne Koordination.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">-- UUIDv7 generieren\nSELECT uuidv7();\n\n-- Zeitstempel aus UUIDv7 extrahieren\nSELECT uuid_extract_timestamp('019271a4-5b00-7123-8456-789abcdef012');\n\n-- Als Standard-Primaerschluessel verwenden\nCREATE TABLE events (\n    id UUID PRIMARY KEY DEFAULT uuidv7(),\n    event_type TEXT NOT NULL,\n    payload JSONB,\n    created_at TIMESTAMPTZ DEFAULT now()\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Leistungsvergleich\u003C\u002Fh3>\n\u003Cp>Auf einer Tabelle mit 100 Millionen Zeilen:\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Metrik\u003C\u002Fth>\u003Cth>UUIDv4 PK\u003C\u002Fth>\u003Cth>UUIDv7 PK\u003C\u002Fth>\u003Cth>BIGSERIAL PK\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Einfuegerate (Zeilen\u002FSek)\u003C\u002Ftd>\u003Ctd>45.000\u003C\u002Ftd>\u003Ctd>112.000\u003C\u002Ftd>\u003Ctd>125.000\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Indexgroesse\u003C\u002Ftd>\u003Ctd>4,2 GB\u003C\u002Ftd>\u003Ctd>4,2 GB\u003C\u002Ftd>\u003Ctd>2,1 GB\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Index-Cache-Trefferquote\u003C\u002Ftd>\u003Ctd>67%\u003C\u002Ftd>\u003Ctd>94%\u003C\u002Ftd>\u003Ctd>96%\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Point-Lookup-Latenz (p99)\u003C\u002Ftd>\u003Ctd>2,1 ms\u003C\u002Ftd>\u003Ctd>0,4 ms\u003C\u002Ftd>\u003Ctd>0,3 ms\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"virtuelle-generierte-spalten\">Virtuelle generierte Spalten\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE products (\n    id UUID PRIMARY KEY DEFAULT uuidv7(),\n    name TEXT NOT NULL,\n    price_cents INTEGER NOT NULL,\n    tax_rate NUMERIC(5,4) NOT NULL DEFAULT 0.11,\n    -- Virtuell: bei Lesung berechnet, kein Speicheraufwand\n    price_with_tax NUMERIC GENERATED ALWAYS AS (price_cents * (1 + tax_rate)) VIRTUAL,\n    -- Gespeichert: bei Schreibung berechnet, belegt Speicherplatz\n    search_vector TSVECTOR GENERATED ALWAYS AS (to_tsvector('english', name)) STORED\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Wann VIRTUAL vs STORED verwenden\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>VIRTUAL verwenden wenn:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Die Berechnung guenstig ist (Arithmetik, String-Verkettung, Typ-Umwandlung)\u003C\u002Fli>\n\u003Cli>Null Speicher-Overhead gewuenscht ist\u003C\u002Fli>\n\u003Cli>Die Spalte selten oder nur mit der Zeile abgefragt wird\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>STORED verwenden wenn:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Die Berechnung teuer ist (Volltextsuch-Vektoren, komplexe JSON-Extraktion)\u003C\u002Fli>\n\u003Cli>Ein Index auf der generierten Spalte benoetigt wird\u003C\u002Fli>\n\u003Cli>Die Spalte haeufig in WHERE oder JOIN verwendet wird\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"oauth-authentifizierung\">OAuth-Authentifizierung\u003C\u002Fh2>\n\u003Cp>PostgreSQL 18 fuegt OAuth 2.0 \u002F OpenID Connect als native Authentifizierungsmethode in pg_hba.conf hinzu.\u003C\u002Fp>\n\u003Ch2 id=\"temporale-constraints\">Temporale Constraints\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE employee_departments (\n    employee_id INTEGER NOT NULL,\n    department_id INTEGER NOT NULL,\n    valid_from DATE NOT NULL,\n    valid_to DATE NOT NULL,\n    PERIOD FOR valid_period (valid_from, valid_to),\n    PRIMARY KEY (employee_id, valid_period WITHOUT OVERLAPS)\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"old-new-in-returning-klauseln\">OLD\u002FNEW in RETURNING-Klauseln\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">UPDATE products\nSET price_cents = price_cents * 1.1\nWHERE category = 'electronics'\nRETURNING\n    id,\n    OLD.price_cents AS previous_price,\n    NEW.price_cents AS updated_price,\n    name;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"skip-scan-fuer-mehrspalten-b-tree-indizes\">Skip-Scan fuer Mehrspalten-B-Tree-Indizes\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE INDEX idx_locations ON locations (country, city, population);\n\n-- PG 17: Vollstaendiger Index-Scan\n-- PG 18: Skip-Scan (springt zwischen verschiedenen 'country'-Werten)\nSELECT * FROM locations WHERE city = 'Jakarta';\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"migrationsanleitung-postgresql-17-auf-18\">Migrationsanleitung: PostgreSQL 17 auf 18\u003C\u002Fh2>\n\u003Ch3>Checkliste vor dem Upgrade\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Cstrong>Erweiterungskompatibilitaet pruefen.\u003C\u002Fstrong> \u003Ccode>SELECT * FROM pg_available_extensions;\u003C\u002Fcode> auf einer PG-18-Testinstanz ausfuehren.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>pg_hba.conf ueberpruefen.\u003C\u002Fstrong> Die neue OAuth-Methode ist additiv.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>I\u002FO-Leistung testen.\u003C\u002Fstrong> Das neue asynchrone I\u002FO-Subsystem ist standardmaessig aktiviert.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Generierte Spalten auditieren.\u003C\u002Fstrong> Sicherstellen, dass keine Indizes von ihnen abhaengen.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Anwendungsabfragen testen.\u003C\u002Fstrong> Skip-Scan kann Abfrageplaene aendern.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Upgrade-Methoden\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>pg_upgrade (empfohlen):\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">pg_ctl -D \u002Fvar\u002Flib\u002Fpostgresql\u002F17\u002Fdata stop\npg_upgrade \\\n  --old-datadir=\u002Fvar\u002Flib\u002Fpostgresql\u002F17\u002Fdata \\\n  --new-datadir=\u002Fvar\u002Flib\u002Fpostgresql\u002F18\u002Fdata \\\n  --old-bindir=\u002Fusr\u002Flib\u002Fpostgresql\u002F17\u002Fbin \\\n  --new-bindir=\u002Fusr\u002Flib\u002Fpostgresql\u002F18\u002Fbin \\\n  --link\npg_ctl -D \u002Fvar\u002Flib\u002Fpostgresql\u002F18\u002Fdata start\nvacuumdb --all --analyze-in-stages\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Logische Replikation (Zero Downtime):\u003C\u002Fstrong> Logische Replikation von PG 17 nach PG 18 einrichten, Synchronisation abwarten, dann Anwendungs-Connection-String umstellen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Managed Services:\u003C\u002Fstrong> AWS RDS, Google Cloud SQL, Azure Database und Neon unterstuetzen alle Major-Version-Upgrades mit minimaler Downtime.\u003C\u002Fp>\n\u003Ch2 id=\"faq\">FAQ\u003C\u002Fh2>\n\u003Ch3 id=\"ist-postgresql-18-produktionsreif\">Ist PostgreSQL 18 produktionsreif?\u003C\u002Fh3>\n\u003Cp>Ja. PostgreSQL folgt einem rigorosen Release-Prozess. Das .0-Release hat Produktionsqualitaet. Das Warten auf das .1-Patch-Release (typischerweise 2-3 Monate nach .0) ist eine vernuenftige Strategie fuer risikoaverse Organisationen.\u003C\u002Fp>\n\u003Ch3 id=\"sollte-ich-fuer-bestehende-tabellen-von-uuidv4-auf-uuidv7-wechseln\">Sollte ich fuer bestehende Tabellen von UUIDv4 auf UUIDv7 wechseln?\u003C\u002Fh3>\n\u003Cp>Fuer neue Tabellen verwenden Sie uuidv7() als Standard. Fuer bestehende Tabellen rechtfertigen die Migrationskosten selten den Nutzen, es sei denn, Sie haben messbare Index-Bloat- oder Cache-Miss-Probleme.\u003C\u002Fp>\n\u003Ch3 id=\"benoetigt-die-neue-i-o-engine-kernel-aenderungen\">Benoetigt die neue I\u002FO-Engine Kernel-Aenderungen?\u003C\u002Fh3>\n\u003Cp>io_uring-Unterstuetzung erfordert Linux-Kernel 5.10 oder neuer. PostgreSQL 18 faellt bei aelteren Kerneln auf Worker-Thread-basiertes asynchrones I\u002FO zurueck.\u003C\u002Fp>\n\u003Ch3 id=\"koennen-virtuelle-spalten-mit-pgvector-verwendet-werden\">Koennen virtuelle Spalten mit pgvector verwendet werden?\u003C\u002Fh3>\n\u003Cp>Nicht direkt. pgvector-Embeddings werden typischerweise gespeichert, nicht berechnet. Sie koennen jedoch virtuelle Spalten fuer abgeleitete Metriken wie \u003Ccode>vector_dims(embedding)\u003C\u002Fcode> verwenden.\u003C\u002Fp>\n\u003Ch3 id=\"wie-interagieren-temporale-constraints-mit-partitionierung\">Wie interagieren temporale Constraints mit Partitionierung?\u003C\u002Fh3>\n\u003Cp>Temporale Constraints funktionieren mit deklarativer Partitionierung.\u003C\u002Fp>\n\u003Ch3 id=\"was-ist-mit-den-merge-verbesserungen\">Was ist mit den MERGE-Verbesserungen?\u003C\u002Fh3>\n\u003Cp>PostgreSQL 18 erweitert MERGE um RETURNING-Klausel-Unterstuetzung.\u003C\u002Fp>\n","de","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:46.869291Z","PostgreSQL 18 im Detail — uuidv7, virtuelle Spalten, asynchrone I\u002FO-Engine (2025)","Komplettanleitung zu PostgreSQL 18 Features: asynchrone I\u002FO-Engine (3x schneller), natives uuidv7(), virtuelle Spalten, OAuth-Authentifizierung, temporale Constraints und Skip-Scan-Indizes.","postgresql 18 features",null,"index, follow",[22,27],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000012","DevOps","devops","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000005","PostgreSQL","postgresql","Engineering",[33,40,46],{"id":34,"title":35,"slug":36,"excerpt":37,"locale":12,"category_name":38,"published_at":39},"d0000000-0000-0000-0000-000000000680","Warum Bali 2026 zum Impact-Tech-Hub Südostasiens wird","warum-bali-2026-impact-tech-hub-suedostasiens","Bali rangiert auf Platz 16 unter den Startup-Ökosystemen Südostasiens. Mit einer wachsenden Konzentration von Web3-Entwicklern, AI-Nachhaltigkeits-Startups und Eco-Travel-Tech-Unternehmen formt die Insel ihre Nische als Impact-Tech-Hauptstadt der Region.","Ingenieurwesen","2026-03-28T10:44:49.720230Z",{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":38,"published_at":45},"d0000000-0000-0000-0000-000000000679","ASEAN-Datenschutz-Flickenteppich: Compliance-Checkliste für Entwickler","asean-datenschutz-flickenteppich-compliance-checkliste-entwickler","Sieben ASEAN-Länder verfügen mittlerweile über umfassende Datenschutzgesetze mit unterschiedlichen Einwilligungsmodellen, Lokalisierungsanforderungen und Sanktionsstrukturen. Eine praktische Compliance-Checkliste für Entwickler.","2026-03-28T10:44:49.715484Z",{"id":47,"title":48,"slug":49,"excerpt":50,"locale":12,"category_name":38,"published_at":51},"d0000000-0000-0000-0000-000000000678","Indonesias 29-Milliarden-Dollar-Digitaltransformation: Chancen für Softwareunternehmen","indonesias-29-milliarden-dollar-digitaltransformation-chancen-softwareunternehmen","Indonesias IT-Dienstleistungsmarkt wird voraussichtlich 2026 29,03 Milliarden Dollar erreichen, gegenüber 24,37 Milliarden im Jahr 2025. Cloud-Infrastruktur, AI, E-Commerce und Rechenzentren treiben das schnellste Wachstum in Südostasien.","2026-03-28T10:44:49.697275Z",{"id":13,"name":53,"slug":54,"bio":55,"photo_url":19,"linkedin":19,"role":56,"created_at":57,"updated_at":57},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]