[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-28-khatt-anabib-bayanat-ali-intajiya-idrij-dufaat-copy":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},"d9000000-0000-0000-0000-000000000128","a0000000-0000-0000-0000-000000000095","Deep EVM #28: خط أنابيب بيانات عالي الإنتاجية — إدراج دُفعات وCOPY وحل التعارضات","deep-evm-28-khatt-anabib-bayanat-ali-intajiya-idrij-dufaat-copy","بناء خط أنابيب بيانات يعالج ملايين الصفوف: COPY protocol لسرعة قصوى، إدراج الدُفعات، ON CONFLICT للوحدانية.","## المشكلة: ملايين الصفوف في الثانية\n\nعندما تحتاج لإدراج 100,000+ صف في الثانية — بيانات بلوكتشين، سجلات أحداث، بيانات استشعار — INSERT العادي لا يكفي.\n\n## مقارنة طرق الإدراج\n\n### INSERT الفردي\n```sql\nINSERT INTO events (id, data) VALUES ($1, $2);\n-- ~1,000 صف\u002Fثانية\n```\n\n### إدراج الدُفعات\n```sql\nINSERT INTO events (id, data) VALUES\n    ($1, $2), ($3, $4), ($5, $6), ...;\n-- ~50,000 صف\u002Fثانية\n```\n\n### COPY Protocol\n```sql\nCOPY events (id, data) FROM STDIN (FORMAT BINARY);\n-- ~500,000 صف\u002Fثانية\n```\n\n## COPY مع sqlx في Rust\n\n```rust\nuse sqlx::postgres::PgCopyIn;\n\nasync fn bulk_insert(pool: &PgPool, events: &[Event]) -> Result\u003C()> {\n    let mut conn = pool.acquire().await?;\n    let mut copy = conn\n        .copy_in_raw(\"COPY events (id, data, created_at) FROM STDIN WITH (FORMAT CSV)\")\n        .await?;\n    \n    for event in events {\n        let line = format!(\"{},{},{}\\n\", event.id, event.data, event.created_at);\n        copy.send(line.as_bytes()).await?;\n    }\n    \n    copy.finish().await?;\n    Ok(())\n}\n```\n\n## ON CONFLICT للوحدانية\n\n```sql\nINSERT INTO chain_profits (chain_id, profit, updated_at)\nVALUES ($1, $2, NOW())\nON CONFLICT (chain_id) DO UPDATE SET\n    profit = EXCLUDED.profit,\n    updated_at = EXCLUDED.updated_at\nWHERE chain_profits.profit \u003C EXCLUDED.profit;\n```\n\n## نمط المُنتِج-المستهلِك للدُفعات\n\n```rust\nuse tokio::sync::mpsc;\n\nasync fn batch_writer(\n    pool: PgPool,\n    mut rx: mpsc::Receiver\u003CEvent>,\n    batch_size: usize,\n    flush_interval: Duration,\n) {\n    let mut buffer = Vec::with_capacity(batch_size);\n    let mut interval = tokio::time::interval(flush_interval);\n    \n    loop {\n        tokio::select! {\n            Some(event) = rx.recv() => {\n                buffer.push(event);\n                if buffer.len() >= batch_size {\n                    flush(&pool, &mut buffer).await;\n                }\n            }\n            _ = interval.tick() => {\n                if !buffer.is_empty() {\n                    flush(&pool, &mut buffer).await;\n                }\n            }\n        }\n    }\n}\n\nasync fn flush(pool: &PgPool, buffer: &mut Vec\u003CEvent>) {\n    if let Err(e) = bulk_insert(pool, buffer).await {\n        tracing::error!(\"فشل الإدراج الجماعي: {e}\");\n    }\n    buffer.clear();\n}\n```\n\n## مقاييس الأداء\n\n| الطريقة | الصفوف\u002Fثانية | الزمن (100K صف) |\n|---------|-------------|----------------|\n| INSERT فردي | 1,000 | 100 ثانية |\n| INSERT دُفعات (100) | 50,000 | 2 ثانية |\n| INSERT دُفعات (1000) | 100,000 | 1 ثانية |\n| COPY | 500,000 | 0.2 ثانية |\n\n## الخلاصة\n\nلخطوط أنابيب البيانات عالية الإنتاجية: استخدم COPY للسرعة القصوى، إدراج الدُفعات للمرونة، ON CONFLICT للوحدانية، ونمط المُنتِج-المستهلِك للتحكم في التدفق.","\u003Ch2 id=\"\">المشكلة: ملايين الصفوف في الثانية\u003C\u002Fh2>\n\u003Cp>عندما تحتاج لإدراج 100,000+ صف في الثانية — بيانات بلوكتشين، سجلات أحداث، بيانات استشعار — INSERT العادي لا يكفي.\u003C\u002Fp>\n\u003Ch2 id=\"\">مقارنة طرق الإدراج\u003C\u002Fh2>\n\u003Ch3>INSERT الفردي\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">INSERT INTO events (id, data) VALUES ($1, $2);\n-- ~1,000 صف\u002Fثانية\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>إدراج الدُفعات\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">INSERT INTO events (id, data) VALUES\n    ($1, $2), ($3, $4), ($5, $6), ...;\n-- ~50,000 صف\u002Fثانية\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>COPY Protocol\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">COPY events (id, data) FROM STDIN (FORMAT BINARY);\n-- ~500,000 صف\u002Fثانية\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"copy-sqlx-rust\">COPY مع sqlx في Rust\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use sqlx::postgres::PgCopyIn;\n\nasync fn bulk_insert(pool: &amp;PgPool, events: &amp;[Event]) -&gt; Result&lt;()&gt; {\n    let mut conn = pool.acquire().await?;\n    let mut copy = conn\n        .copy_in_raw(\"COPY events (id, data, created_at) FROM STDIN WITH (FORMAT CSV)\")\n        .await?;\n    \n    for event in events {\n        let line = format!(\"{},{},{}\\n\", event.id, event.data, event.created_at);\n        copy.send(line.as_bytes()).await?;\n    }\n    \n    copy.finish().await?;\n    Ok(())\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"on-conflict\">ON CONFLICT للوحدانية\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">INSERT INTO chain_profits (chain_id, profit, updated_at)\nVALUES ($1, $2, NOW())\nON CONFLICT (chain_id) DO UPDATE SET\n    profit = EXCLUDED.profit,\n    updated_at = EXCLUDED.updated_at\nWHERE chain_profits.profit &lt; EXCLUDED.profit;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">نمط المُنتِج-المستهلِك للدُفعات\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio::sync::mpsc;\n\nasync fn batch_writer(\n    pool: PgPool,\n    mut rx: mpsc::Receiver&lt;Event&gt;,\n    batch_size: usize,\n    flush_interval: Duration,\n) {\n    let mut buffer = Vec::with_capacity(batch_size);\n    let mut interval = tokio::time::interval(flush_interval);\n    \n    loop {\n        tokio::select! {\n            Some(event) = rx.recv() =&gt; {\n                buffer.push(event);\n                if buffer.len() &gt;= batch_size {\n                    flush(&amp;pool, &amp;mut buffer).await;\n                }\n            }\n            _ = interval.tick() =&gt; {\n                if !buffer.is_empty() {\n                    flush(&amp;pool, &amp;mut buffer).await;\n                }\n            }\n        }\n    }\n}\n\nasync fn flush(pool: &amp;PgPool, buffer: &amp;mut Vec&lt;Event&gt;) {\n    if let Err(e) = bulk_insert(pool, buffer).await {\n        tracing::error!(\"فشل الإدراج الجماعي: {e}\");\n    }\n    buffer.clear();\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">مقاييس الأداء\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>الطريقة\u003C\u002Fth>\u003Cth>الصفوف\u002Fثانية\u003C\u002Fth>\u003Cth>الزمن (100K صف)\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>INSERT فردي\u003C\u002Ftd>\u003Ctd>1,000\u003C\u002Ftd>\u003Ctd>100 ثانية\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>INSERT دُفعات (100)\u003C\u002Ftd>\u003Ctd>50,000\u003C\u002Ftd>\u003Ctd>2 ثانية\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>INSERT دُفعات (1000)\u003C\u002Ftd>\u003Ctd>100,000\u003C\u002Ftd>\u003Ctd>1 ثانية\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>COPY\u003C\u002Ftd>\u003Ctd>500,000\u003C\u002Ftd>\u003Ctd>0.2 ثانية\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>لخطوط أنابيب البيانات عالية الإنتاجية: استخدم COPY للسرعة القصوى، إدراج الدُفعات للمرونة، ON CONFLICT للوحدانية، ونمط المُنتِج-المستهلِك للتحكم في التدفق.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.827065Z","خط أنابيب بيانات عالي الإنتاجية — إدراج دُفعات وCOPY وحل التعارضات","خط أنابيب بيانات عالي الإنتاجية: COPY protocol، إدراج دُفعات، ON CONFLICT، نمط المُنتِج-المستهلِك.","PostgreSQL COPY أداء",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-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","الهندسة","2026-03-28T10:44:50.120618Z",{"id":48,"title":49,"slug":50,"excerpt":51,"locale":12,"category_name":45,"published_at":52},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":54,"title":55,"slug":56,"excerpt":57,"locale":12,"category_name":45,"published_at":58},"d0000000-0000-0000-0000-000000000684","التحول الرقمي في Indonesia بقيمة 29 مليار دولار: فرص لشركات البرمجيات","attahawwul-arraqami-indonesia-29-milyar-dular-furas-sharikat-albarmajiyat","من المتوقع أن يصل سوق خدمات تكنولوجيا المعلومات في Indonesia إلى 29.03 مليار دولار في 2026، ارتفاعاً من 24.37 مليار دولار في 2025. البنية التحتية السحابية والذكاء الاصطناعي والتجارة الإلكترونية ومراكز البيانات تقود أسرع نمو في جنوب شرق آسيا.","2026-03-28T10:44:50.092728Z",{"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"]