[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-25-taqsim-jadawil-postgresql-10-milyun-saff":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},"d9000000-0000-0000-0000-000000000125","a0000000-0000-0000-0000-000000000095","Deep EVM #25: تقسيم جداول PostgreSQL — عندما يتجاوز جدولك 10 مليون صف","deep-evm-25-taqsim-jadawil-postgresql-10-milyun-saff","متى ولماذا تقسم جداول PostgreSQL: تقسيم بالنطاق والقائمة والتجزئة، الصيانة التلقائية، وتأثير الأداء.","## متى تحتاج التقسيم\n\nعندما يتجاوز جدول 10-100 مليون صف، تبدأ المشاكل:\n- الفهارس تنمو وتبطئ\n- VACUUM يستغرق وقتاً أطول\n- النسخ الاحتياطي يصبح بطيئاً\n- الاستعلامات تتدهور تدريجياً\n\nالتقسيم يحل هذا بتقسيم الجدول إلى أجزاء أصغر وأكثر قابلية للإدارة.\n\n## أنواع التقسيم\n\n### تقسيم بالنطاق (Range)\n```sql\nCREATE TABLE transactions (\n    id UUID DEFAULT gen_random_uuid(),\n    amount NUMERIC NOT NULL,\n    created_at TIMESTAMPTZ NOT NULL\n) PARTITION BY RANGE (created_at);\n\nCREATE TABLE transactions_2024_01 PARTITION OF transactions\n    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');\nCREATE TABLE transactions_2024_02 PARTITION OF transactions\n    FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');\n```\n\n### تقسيم بالقائمة (List)\n```sql\nCREATE TABLE articles (\n    id UUID DEFAULT gen_random_uuid(),\n    locale VARCHAR(5) NOT NULL,\n    title TEXT NOT NULL\n) PARTITION BY LIST (locale);\n\nCREATE TABLE articles_en PARTITION OF articles FOR VALUES IN ('en');\nCREATE TABLE articles_ar PARTITION OF articles FOR VALUES IN ('ar');\nCREATE TABLE articles_ru PARTITION OF articles FOR VALUES IN ('ru');\n```\n\n### تقسيم بالتجزئة (Hash)\n```sql\nCREATE TABLE events (\n    id UUID DEFAULT gen_random_uuid(),\n    user_id UUID NOT NULL,\n    data JSONB\n) PARTITION BY HASH (user_id);\n\nCREATE TABLE events_0 PARTITION OF events FOR VALUES WITH (MODULUS 4, REMAINDER 0);\nCREATE TABLE events_1 PARTITION OF events FOR VALUES WITH (MODULUS 4, REMAINDER 1);\n```\n\n## الصيانة التلقائية\n\n```sql\n-- إنشاء أقسام مستقبلية تلقائياً\nCREATE OR REPLACE FUNCTION create_monthly_partition()\nRETURNS void AS $$\nDECLARE\n    next_month DATE := date_trunc('month', NOW() + interval '1 month');\n    partition_name TEXT;\nBEGIN\n    partition_name := 'transactions_' || to_char(next_month, 'YYYY_MM');\n    EXECUTE format(\n        'CREATE TABLE IF NOT EXISTS %I PARTITION OF transactions FOR VALUES FROM (%L) TO (%L)',\n        partition_name, next_month, next_month + interval '1 month'\n    );\nEND;\n$$ LANGUAGE plpgsql;\n```\n\n## تأثير الأداء\n\n| العملية | بدون تقسيم (100M صف) | مع تقسيم (12 قسم) |\n|---------|---------------------|-------------------|\n| SELECT بتاريخ | 2,500ms | 50ms |\n| INSERT | 5ms | 3ms |\n| VACUUM | 45 دقيقة | 4 دقائق |\n| حذف بيانات قديمة | 30 دقيقة | فوري (DROP PARTITION) |\n\n## الخلاصة\n\nتقسيم الجداول ضروري عندما تنمو البيانات. اختر النوع المناسب: بالنطاق للبيانات الزمنية، بالقائمة للفئات، بالتجزئة للتوزيع المتساوي.","\u003Ch2 id=\"\">متى تحتاج التقسيم\u003C\u002Fh2>\n\u003Cp>عندما يتجاوز جدول 10-100 مليون صف، تبدأ المشاكل:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>الفهارس تنمو وتبطئ\u003C\u002Fli>\n\u003Cli>VACUUM يستغرق وقتاً أطول\u003C\u002Fli>\n\u003Cli>النسخ الاحتياطي يصبح بطيئاً\u003C\u002Fli>\n\u003Cli>الاستعلامات تتدهور تدريجياً\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>التقسيم يحل هذا بتقسيم الجدول إلى أجزاء أصغر وأكثر قابلية للإدارة.\u003C\u002Fp>\n\u003Ch2 id=\"\">أنواع التقسيم\u003C\u002Fh2>\n\u003Ch3>تقسيم بالنطاق (Range)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE transactions (\n    id UUID DEFAULT gen_random_uuid(),\n    amount NUMERIC NOT NULL,\n    created_at TIMESTAMPTZ NOT NULL\n) PARTITION BY RANGE (created_at);\n\nCREATE TABLE transactions_2024_01 PARTITION OF transactions\n    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');\nCREATE TABLE transactions_2024_02 PARTITION OF transactions\n    FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>تقسيم بالقائمة (List)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE articles (\n    id UUID DEFAULT gen_random_uuid(),\n    locale VARCHAR(5) NOT NULL,\n    title TEXT NOT NULL\n) PARTITION BY LIST (locale);\n\nCREATE TABLE articles_en PARTITION OF articles FOR VALUES IN ('en');\nCREATE TABLE articles_ar PARTITION OF articles FOR VALUES IN ('ar');\nCREATE TABLE articles_ru PARTITION OF articles FOR VALUES IN ('ru');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>تقسيم بالتجزئة (Hash)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">CREATE TABLE events (\n    id UUID DEFAULT gen_random_uuid(),\n    user_id UUID NOT NULL,\n    data JSONB\n) PARTITION BY HASH (user_id);\n\nCREATE TABLE events_0 PARTITION OF events FOR VALUES WITH (MODULUS 4, REMAINDER 0);\nCREATE TABLE events_1 PARTITION OF events FOR VALUES WITH (MODULUS 4, REMAINDER 1);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">الصيانة التلقائية\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">-- إنشاء أقسام مستقبلية تلقائياً\nCREATE OR REPLACE FUNCTION create_monthly_partition()\nRETURNS void AS $$\nDECLARE\n    next_month DATE := date_trunc('month', NOW() + interval '1 month');\n    partition_name TEXT;\nBEGIN\n    partition_name := 'transactions_' || to_char(next_month, 'YYYY_MM');\n    EXECUTE format(\n        'CREATE TABLE IF NOT EXISTS %I PARTITION OF transactions FOR VALUES FROM (%L) TO (%L)',\n        partition_name, next_month, next_month + interval '1 month'\n    );\nEND;\n$$ LANGUAGE plpgsql;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">تأثير الأداء\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>العملية\u003C\u002Fth>\u003Cth>بدون تقسيم (100M صف)\u003C\u002Fth>\u003Cth>مع تقسيم (12 قسم)\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>SELECT بتاريخ\u003C\u002Ftd>\u003Ctd>2,500ms\u003C\u002Ftd>\u003Ctd>50ms\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>INSERT\u003C\u002Ftd>\u003Ctd>5ms\u003C\u002Ftd>\u003Ctd>3ms\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>VACUUM\u003C\u002Ftd>\u003Ctd>45 دقيقة\u003C\u002Ftd>\u003Ctd>4 دقائق\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>حذف بيانات قديمة\u003C\u002Ftd>\u003Ctd>30 دقيقة\u003C\u002Ftd>\u003Ctd>فوري (DROP PARTITION)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>تقسيم الجداول ضروري عندما تنمو البيانات. اختر النوع المناسب: بالنطاق للبيانات الزمنية، بالقائمة للفئات، بالتجزئة للتوزيع المتساوي.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.813503Z","تقسيم جداول PostgreSQL — عندما يتجاوز جدولك 10 مليون صف","تقسيم جداول PostgreSQL: بالنطاق والقائمة والتجزئة، الصيانة التلقائية، وتأثير الأداء.","PostgreSQL تقسيم جداول",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-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","الهندسة","2026-03-28T10:44:50.120618Z",{"id":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":41,"published_at":48},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":41,"published_at":54},"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":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"]