[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-28-hochdurchsatz-datenpipeline-batch-inserts":3},{"article":4,"author":59},{"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":39},"d7000000-0000-0000-0000-000000000128","a0000000-0000-0000-0000-000000000075","Deep EVM #28: Hochdurchsatz-Datenpipeline — Batch-Inserts, COPY und Konfliktloesung","deep-evm-28-hochdurchsatz-datenpipeline-batch-inserts","Hochdurchsatz-Datenpipelines mit PostgreSQL aufbauen: COPY-Protokoll, Bulk-Upsert-Muster, WAL-Tuning, Connection-Pooling mit PgBouncer und Monitoring.","## Das Problem: Milliarden von Zeilen schnell einfuegen\n\nEin Blockchain-Indexer, der Millionen von Bloecken verarbeitet, muss Milliarden von Zeilen so schnell wie moeglich einfuegen. Einzelne INSERT-Anweisungen erreichen maximal 5.000 Zeilen pro Sekunde; das COPY-Protokoll schafft 250.000+ Zeilen pro Sekunde.\n\n## COPY-Protokoll\n\nCOPY ist PostgreSQLs schnellster Weg, Daten zu laden:\n\n```rust\nuse tokio_postgres::CopyInSink;\nuse bytes::BytesMut;\n\nasync fn bulk_insert(\n    client: &Client,\n    transactions: &[Transaction],\n) -> Result\u003Cu64, Error> {\n    let sink = client.copy_in(\n        \"COPY transactions (block_number, tx_hash, from_addr, value_wei) \\\n         FROM STDIN BINARY\"\n    ).await?;\n    \n    let writer = BinaryCopyInWriter::new(sink, &[\n        Type::INT8,   \u002F\u002F block_number\n        Type::BYTEA,  \u002F\u002F tx_hash\n        Type::BYTEA,  \u002F\u002F from_addr\n        Type::NUMERIC, \u002F\u002F value_wei\n    ]);\n    \n    pin_mut!(writer);\n    for tx in transactions {\n        writer.as_mut().write(&[\n            &tx.block_number,\n            &tx.tx_hash.as_ref(),\n            &tx.from_addr.as_ref(),\n            &tx.value_wei,\n        ]).await?;\n    }\n    \n    writer.finish().await\n}\n```\n\n## Bulk-Upsert-Muster\n\nFuer Daten mit moeglichen Duplikaten:\n\n```sql\n-- Temporaere Staging-Tabelle (ungeloggt = schneller)\nCREATE UNLOGGED TABLE staging_transactions (LIKE transactions INCLUDING ALL);\n\n-- Daten per COPY in Staging laden\nCOPY staging_transactions FROM STDIN BINARY;\n\n-- Upsert von Staging in Zieltabelle\nINSERT INTO transactions\nSELECT * FROM staging_transactions\nON CONFLICT (tx_hash) DO UPDATE SET\n    value_wei = EXCLUDED.value_wei;\n\n-- Staging bereinigen\nTRUNCATE staging_transactions;\n```\n\n## WAL-Tuning\n\nWrite-Ahead-Log-Konfiguration fuer Hochdurchsatz:\n\n```ini\n# postgresql.conf\nwal_level = minimal           # Wenn keine Replikation noetig\nmax_wal_size = 8GB            # Groessere WAL-Segmente\ncheckpoint_completion_target = 0.9\ncommit_delay = 100            # Mikrosekunden Verzoegerung fuer Group Commit\n```\n\n## Connection Pooling mit PgBouncer\n\n```ini\n# pgbouncer.ini\n[databases]\nmydb = host=localhost dbname=mydb\n\n[pgbouncer]\npool_mode = transaction\nmax_client_conn = 1000\ndefault_pool_size = 50\n```\n\nTransaction-Pooling-Modus: Verbindungen werden nach jeder Transaktion freigegeben, was 1.000 Clients mit 50 DB-Verbindungen bedient.\n\n## Monitoring mit pg_stat_statements\n\n```sql\n-- Langsamste Abfragen finden\nSELECT\n    query,\n    calls,\n    mean_exec_time,\n    total_exec_time\nFROM pg_stat_statements\nORDER BY total_exec_time DESC\nLIMIT 20;\n```\n\n## Fazit\n\nHochdurchsatz-Datenpipelines mit PostgreSQL erfordern das COPY-Protokoll fuer maximale Einfuegegeschwindigkeit, Bulk-Upsert-Muster fuer Duplikatbehandlung, WAL-Tuning fuer Schreibdurchsatz, PgBouncer fuer effizientes Connection Pooling und pg_stat_statements fuer Monitoring. Die Kombination dieser Techniken verwandelt PostgreSQL von einer Standard-Datenbank in eine Hochleistungs-Datenpipeline.","\u003Ch2 id=\"das-problem-milliarden-von-zeilen-schnell-einfuegen\">Das Problem: Milliarden von Zeilen schnell einfuegen\u003C\u002Fh2>\n\u003Cp>Ein Blockchain-Indexer, der Millionen von Bloecken verarbeitet, muss Milliarden von Zeilen so schnell wie moeglich einfuegen. Einzelne INSERT-Anweisungen erreichen maximal 5.000 Zeilen pro Sekunde; das COPY-Protokoll schafft 250.000+ Zeilen pro Sekunde.\u003C\u002Fp>\n\u003Ch2 id=\"copy-protokoll\">COPY-Protokoll\u003C\u002Fh2>\n\u003Cp>COPY ist PostgreSQLs schnellster Weg, Daten zu laden:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio_postgres::CopyInSink;\nuse bytes::BytesMut;\n\nasync fn bulk_insert(\n    client: &amp;Client,\n    transactions: &amp;[Transaction],\n) -&gt; Result&lt;u64, Error&gt; {\n    let sink = client.copy_in(\n        \"COPY transactions (block_number, tx_hash, from_addr, value_wei) \\\n         FROM STDIN BINARY\"\n    ).await?;\n    \n    let writer = BinaryCopyInWriter::new(sink, &amp;[\n        Type::INT8,   \u002F\u002F block_number\n        Type::BYTEA,  \u002F\u002F tx_hash\n        Type::BYTEA,  \u002F\u002F from_addr\n        Type::NUMERIC, \u002F\u002F value_wei\n    ]);\n    \n    pin_mut!(writer);\n    for tx in transactions {\n        writer.as_mut().write(&amp;[\n            &amp;tx.block_number,\n            &amp;tx.tx_hash.as_ref(),\n            &amp;tx.from_addr.as_ref(),\n            &amp;tx.value_wei,\n        ]).await?;\n    }\n    \n    writer.finish().await\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"bulk-upsert-muster\">Bulk-Upsert-Muster\u003C\u002Fh2>\n\u003Cp>Fuer Daten mit moeglichen Duplikaten:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">-- Temporaere Staging-Tabelle (ungeloggt = schneller)\nCREATE UNLOGGED TABLE staging_transactions (LIKE transactions INCLUDING ALL);\n\n-- Daten per COPY in Staging laden\nCOPY staging_transactions FROM STDIN BINARY;\n\n-- Upsert von Staging in Zieltabelle\nINSERT INTO transactions\nSELECT * FROM staging_transactions\nON CONFLICT (tx_hash) DO UPDATE SET\n    value_wei = EXCLUDED.value_wei;\n\n-- Staging bereinigen\nTRUNCATE staging_transactions;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"wal-tuning\">WAL-Tuning\u003C\u002Fh2>\n\u003Cp>Write-Ahead-Log-Konfiguration fuer Hochdurchsatz:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-ini\"># postgresql.conf\nwal_level = minimal           # Wenn keine Replikation noetig\nmax_wal_size = 8GB            # Groessere WAL-Segmente\ncheckpoint_completion_target = 0.9\ncommit_delay = 100            # Mikrosekunden Verzoegerung fuer Group Commit\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"connection-pooling-mit-pgbouncer\">Connection Pooling mit PgBouncer\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-ini\"># pgbouncer.ini\n[databases]\nmydb = host=localhost dbname=mydb\n\n[pgbouncer]\npool_mode = transaction\nmax_client_conn = 1000\ndefault_pool_size = 50\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Transaction-Pooling-Modus: Verbindungen werden nach jeder Transaktion freigegeben, was 1.000 Clients mit 50 DB-Verbindungen bedient.\u003C\u002Fp>\n\u003Ch2 id=\"monitoring-mit-pg-stat-statements\">Monitoring mit pg_stat_statements\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">-- Langsamste Abfragen finden\nSELECT\n    query,\n    calls,\n    mean_exec_time,\n    total_exec_time\nFROM pg_stat_statements\nORDER BY total_exec_time DESC\nLIMIT 20;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"fazit\">Fazit\u003C\u002Fh2>\n\u003Cp>Hochdurchsatz-Datenpipelines mit PostgreSQL erfordern das COPY-Protokoll fuer maximale Einfuegegeschwindigkeit, Bulk-Upsert-Muster fuer Duplikatbehandlung, WAL-Tuning fuer Schreibdurchsatz, PgBouncer fuer effizientes Connection Pooling und pg_stat_statements fuer Monitoring. Die Kombination dieser Techniken verwandelt PostgreSQL von einer Standard-Datenbank in eine Hochleistungs-Datenpipeline.\u003C\u002Fp>\n","de","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:30.400257Z","Hochdurchsatz-Datenpipeline — Batch-Inserts, COPY und Konfliktloesung","Hochdurchsatz-PostgreSQL-Datenpipelines mit COPY-Protokoll, Bulk-Upserts, WAL-Tuning, PgBouncer-Connection-Pooling und pg_stat_statements-Monitoring aufbauen.","PostgreSQL Hochdurchsatz-Datenpipeline",null,"index, follow",[22,27,31,35],{"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",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust",[40,47,53],{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":45,"published_at":46},"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":48,"title":49,"slug":50,"excerpt":51,"locale":12,"category_name":45,"published_at":52},"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":54,"title":55,"slug":56,"excerpt":57,"locale":12,"category_name":45,"published_at":58},"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":60,"slug":61,"bio":62,"photo_url":19,"linkedin":19,"role":63,"created_at":64,"updated_at":64},"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"]