[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-25-postgresql-tabellenpartitionierung":3},{"article":4,"author":55},{"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":24,"related_articles":35},"d7000000-0000-0000-0000-000000000125","a0000000-0000-0000-0000-000000000075","Deep EVM #25: PostgreSQL-Tabellenpartitionierung — Wenn Ihre Tabelle 10M+ Zeilen erreicht","deep-evm-25-postgresql-tabellenpartitionierung","Ein praktischer Leitfaden zur PostgreSQL-Tabellenpartitionierung fuer grosse Tabellen. Range-, List- und Hash-Partitionierung mit echten Beispielen, Migrationsstrategien und Abfrageplanung.","## Warum Partitionierung?\n\nSie haben eine Transaktions-Tabelle, die klein angefangen hat und jetzt bei 34 Millionen Zeilen ist. Abfragen, die frueher 50ms dauerten, brauchen jetzt 5 Sekunden. VACUUM laeuft stundenlang. Tabellenpartitionierung teilt eine logische Tabelle in mehrere physische Tabellen auf, und PostgreSQLs Abfrageplaner leitet Abfragen automatisch an die korrekten Partitionen weiter.\n\n## Partitionierungstypen\n\n### Range-Partitionierung\nIdeal fuer Zeitreihen- und monoton steigende Daten:\n\n```sql\nCREATE TABLE transactions (\n    id BIGINT GENERATED ALWAYS AS IDENTITY,\n    block_number BIGINT NOT NULL,\n    tx_hash BYTEA NOT NULL,\n    from_addr BYTEA NOT NULL,\n    value_wei NUMERIC NOT NULL,\n    created_at TIMESTAMPTZ DEFAULT NOW()\n) PARTITION BY RANGE (block_number);\n\n-- Partitionen erstellen\nCREATE TABLE transactions_p0 PARTITION OF transactions\n    FOR VALUES FROM (0) TO (1000000);\nCREATE TABLE transactions_p1 PARTITION OF transactions\n    FOR VALUES FROM (1000000) TO (2000000);\n-- ...\n```\n\n### List-Partitionierung\nFuer kategorische Daten:\n```sql\nCREATE TABLE events PARTITION BY LIST (event_type);\nCREATE TABLE events_transfer PARTITION OF events FOR VALUES IN ('Transfer');\nCREATE TABLE events_approval PARTITION OF events FOR VALUES IN ('Approval');\n```\n\n### Hash-Partitionierung\nFuer gleichmaessige Verteilung ohne natuerliche Bereiche:\n```sql\nCREATE TABLE addresses PARTITION BY HASH (address);\nCREATE TABLE addresses_p0 PARTITION OF addresses FOR VALUES WITH (MODULUS 4, REMAINDER 0);\nCREATE TABLE addresses_p1 PARTITION OF addresses FOR VALUES WITH (MODULUS 4, REMAINDER 1);\n```\n\n## Migration bestehender Daten\n\n```sql\n-- 1. Neue partitionierte Tabelle erstellen\nCREATE TABLE transactions_new (...) PARTITION BY RANGE (block_number);\n\n-- 2. Partitionen erstellen\n-- ...\n\n-- 3. Daten kopieren (in Batches!)\nINSERT INTO transactions_new\nSELECT * FROM transactions\nWHERE block_number >= 0 AND block_number \u003C 1000000;\n\n-- 4. Tabellen tauschen\nALTER TABLE transactions RENAME TO transactions_old;\nALTER TABLE transactions_new RENAME TO transactions;\n```\n\n## Partition Pruning\n\nDer Abfrageplaner eliminiert nicht benoetigte Partitionen automatisch:\n\n```sql\nEXPLAIN (ANALYZE)\nSELECT * FROM transactions\nWHERE block_number BETWEEN 18000000 AND 18100000;\n\n-- Ausgabe: Scannt nur die relevante Partition\n-- Append (actual time=0.1..5.2 rows=50234)\n--   -> Seq Scan on transactions_p18 (actual time=0.1..5.2 rows=50234)\n--        Filter: block_number >= 18000000 AND block_number \u003C= 18100000\n-- 19 andere Partitionen werden NICHT gescannt\n```\n\n## Fazit\n\nTabellenpartitionierung ist ein maaechtiges Werkzeug fuer grosse PostgreSQL-Tabellen. Range-Partitionierung fuer Zeitreihen, List-Partitionierung fuer Kategorien und Hash-Partitionierung fuer gleichmaessige Verteilung. Der Schluessel: Waehlen Sie den Partitionierungsschluessel so, dass er Ihren haeufigsten Abfragemuster entspricht.","\u003Ch2 id=\"warum-partitionierung\">Warum Partitionierung?\u003C\u002Fh2>\n\u003Cp>Sie haben eine Transaktions-Tabelle, die klein angefangen hat und jetzt bei 34 Millionen Zeilen ist. Abfragen, die frueher 50ms dauerten, brauchen jetzt 5 Sekunden. VACUUM laeuft stundenlang. Tabellenpartitionierung teilt eine logische Tabelle in mehrere physische Tabellen auf, und PostgreSQLs Abfrageplaner leitet Abfragen automatisch an die korrekten Partitionen weiter.\u003C\u002Fp>\n\u003Ch2 id=\"partitionierungstypen\">Partitionierungstypen\u003C\u002Fh2>\n\u003Ch3>Range-Partitionierung\u003C\u002Fh3>\n\u003Cp>Ideal fuer Zeitreihen- und monoton steigende Daten:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE transactions (\n    id BIGINT GENERATED ALWAYS AS IDENTITY,\n    block_number BIGINT NOT NULL,\n    tx_hash BYTEA NOT NULL,\n    from_addr BYTEA NOT NULL,\n    value_wei NUMERIC NOT NULL,\n    created_at TIMESTAMPTZ DEFAULT NOW()\n) PARTITION BY RANGE (block_number);\n\n-- Partitionen erstellen\nCREATE TABLE transactions_p0 PARTITION OF transactions\n    FOR VALUES FROM (0) TO (1000000);\nCREATE TABLE transactions_p1 PARTITION OF transactions\n    FOR VALUES FROM (1000000) TO (2000000);\n-- ...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>List-Partitionierung\u003C\u002Fh3>\n\u003Cp>Fuer kategorische Daten:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE events PARTITION BY LIST (event_type);\nCREATE TABLE events_transfer PARTITION OF events FOR VALUES IN ('Transfer');\nCREATE TABLE events_approval PARTITION OF events FOR VALUES IN ('Approval');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Hash-Partitionierung\u003C\u002Fh3>\n\u003Cp>Fuer gleichmaessige Verteilung ohne natuerliche Bereiche:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE addresses PARTITION BY HASH (address);\nCREATE TABLE addresses_p0 PARTITION OF addresses FOR VALUES WITH (MODULUS 4, REMAINDER 0);\nCREATE TABLE addresses_p1 PARTITION OF addresses FOR VALUES WITH (MODULUS 4, REMAINDER 1);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"migration-bestehender-daten\">Migration bestehender Daten\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">-- 1. Neue partitionierte Tabelle erstellen\nCREATE TABLE transactions_new (...) PARTITION BY RANGE (block_number);\n\n-- 2. Partitionen erstellen\n-- ...\n\n-- 3. Daten kopieren (in Batches!)\nINSERT INTO transactions_new\nSELECT * FROM transactions\nWHERE block_number &gt;= 0 AND block_number &lt; 1000000;\n\n-- 4. Tabellen tauschen\nALTER TABLE transactions RENAME TO transactions_old;\nALTER TABLE transactions_new RENAME TO transactions;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"partition-pruning\">Partition Pruning\u003C\u002Fh2>\n\u003Cp>Der Abfrageplaner eliminiert nicht benoetigte Partitionen automatisch:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">EXPLAIN (ANALYZE)\nSELECT * FROM transactions\nWHERE block_number BETWEEN 18000000 AND 18100000;\n\n-- Ausgabe: Scannt nur die relevante Partition\n-- Append (actual time=0.1..5.2 rows=50234)\n--   -&gt; Seq Scan on transactions_p18 (actual time=0.1..5.2 rows=50234)\n--        Filter: block_number &gt;= 18000000 AND block_number &lt;= 18100000\n-- 19 andere Partitionen werden NICHT gescannt\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"fazit\">Fazit\u003C\u002Fh2>\n\u003Cp>Tabellenpartitionierung ist ein maaechtiges Werkzeug fuer grosse PostgreSQL-Tabellen. Range-Partitionierung fuer Zeitreihen, List-Partitionierung fuer Kategorien und Hash-Partitionierung fuer gleichmaessige Verteilung. Der Schluessel: Waehlen Sie den Partitionierungsschluessel so, dass er Ihren haeufigsten Abfragemuster entspricht.\u003C\u002Fp>\n","de","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:30.386033Z","PostgreSQL-Tabellenpartitionierung — Wenn Ihre Tabelle 10M+ Zeilen erreicht","Praktischer Leitfaden zur PostgreSQL-Tabellenpartitionierung mit Range-, List- und Hash-Strategien. Echtes Beispiel: Migration von 34M Zeilen auf 20 Partitionen.","PostgreSQL Tabellenpartitionierung",null,"index, follow",[22,27,31],{"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-000000000022","Performance","performance",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000005","PostgreSQL","postgresql",[36,43,49],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":41,"published_at":42},"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":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":41,"published_at":48},"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":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":41,"published_at":54},"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":56,"slug":57,"bio":58,"photo_url":19,"linkedin":19,"role":59,"created_at":60,"updated_at":60},"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"]