PostgreSQL / المتقدم: الأدلة والتشغيل الموثوق / الدرس 15
التقسيم ودورة حياة البيانات
استخدم تقسيم الزمن لاحتفاظ واستعلام مبررين، واشرح التوجيه والاستبعاد والتفرد والصيانة بدلاً من اعتباره تسريعاً عاماً.
في هذه الصفحة
أهداف الدرس
- تصميم أقسام مجالات غير متداخلة بحدود كاملة.
- تقييم استبعاد الأقسام والمفاتيح وأقفال الدورة.
قسم عندما تتفق دورة البيانات والوصول
يعرض الجدول المقسم علاقة منطقية وتخزن فروعه الصفوف. تخدم المجالات والقوائم والتجزئة أنماطاً مختلفة. تفيد الأزمنة الاحتفاظ والحديث وقد تضيف أقسام صغيرة كثيرة كلفة تخطيط وتشغيل. لا يلغي التقسيم فهارس الأقسام اللازمة. ابدأ بالحجم والشروط والاحتفاظ والصيانة؛ البطء وحده لا يبرر الحل.
صرح بمجالات شهرية نصف مفتوحة
يقسم التعريف المسحات حسب scan_day. يشمل أكتوبر بدايته ولا يشمل أول نوفمبر. يضم المفتاح المركب مفتاح التقسيم وفق قيد PostgreSQL لهذا التصميم ولا يثبت تفرد scan_id وحده عالمياً. لا يخزن الأب الصفوف بنفسه ويوجهها للقسم المطابق. التعريف توضيحي ولا يستهدف قاعدة تطبيق.
CREATE TABLE quay_lab.scans (
scan_id bigint NOT NULL, scan_day date NOT NULL, payload text,
PRIMARY KEY (scan_day, scan_id)
) PARTITION BY RANGE (scan_day);
CREATE TABLE quay_lab.scans_2026_10 PARTITION OF quay_lab.scans
FOR VALUES FROM ('2026-10-01') TO ('2026-11-01');
البداية شاملة والنهاية غير شاملة ولا ينشئ المثال قسماً افتراضياً.
غياب القسم فشل إدخال
يفشل الإدخال عند غياب قسم مطابق وافتراضي. قد يلتقط الافتراضي قيماً غير متوقعة ويستلزم فحصها ونقلها قبل ربط مجال أدق متداخل. جهز الأقسام المستقبلية بإجراء مراجع واختبر الحدود. قد ينقل تحديث المفتاح الصف بين الأقسام مع آثار تزامن وقيود. حدد سياسة التاريخ NULL ولا تفترض قبول المجال له.
اجعل شرط التقسيم مرئياً
يطلب الاستعلام أكتوبر فقط بعد تجهيز العينة. تظهر EXPLAIN استبعاد الأقسام غير اللازمة عند التخطيط أو التنفيذ. يعتمد الاستبعاد على الحدود والشروط لا وجود فهرس لكل فرع. قد يفحص شرط الاسم فقط أقساماً كثيرة. لا تدع سرعة رقمية بلا قياس وافحص التحويلات التي تخفي شرط المفتاح في الإصدار المستخدم.
EXPLAIN SELECT scan_id FROM quay_lab.scans
WHERE scan_day >= date '2026-10-01'
AND scan_day < date '2026-11-01';
SELECT tableoid::regclass AS physical_partition, scan_id, scan_day
FROM quay_lab.scans
WHERE scan_day = date '2026-10-01' ORDER BY scan_id;
تعرف tableoid العلاقة الفيزيائية الحاملة للصف؛ تحتاج النتائج عينة معبأة.
يبقى الاحتفاظ تغييراً تشغيلياً
قد يتجنب حذف أو فصل قسم قديم الحذف صفاً صفاً، وتبقى الأقفال والاعتماديات والتعافي مهمة. قد يفحص ATTACH البيانات ويقفلها وللصيغ المتزامنة قيود إصدار. تعالج autovacuum الأوراق وتحتاج إحصاءات الأب سياسة ANALYZE. تحقق من الفهارس والمنح للأقسام الجديدة واربط الجدولة بالنسخ والتقارير التاريخية.
الأخطاء الشائعة وإصلاحها
no partition of relation found for row (23514)
- لماذا يحدث؟
- يقع المفتاح خارج المجالات.
- كيف تصلحه؟
- صحح البيانات أو جهز القسم المستقبلي الصحيح بمراجعة.
- كيف تتجنب تكراره؟
- اختبر الحدود وراقب جاهزية الأقسام المستقبلية.
يتكرر المعرف المفترض عالمياً عبر التواريخ
- لماذا يحدث؟
- يضم المفتاح الفريد scan_day وليس scan_id وحده.
- كيف تصلحه؟
- طابق عقد الهوية مع تصميم التفرد المدعوم.
- كيف تتجنب تكراره؟
- راجع هوية الأقسام قبل ترحيل المفتاح.
لا تزال الاستعلامات تفحص أقساماً كثيرة
- لماذا يحدث؟
- لا تقيد شروطها مفتاح التقسيم بصورة مفيدة.
- كيف تصلحه؟
- افحص الاستبعاد وملاءمة الحمل قبل زيادة الأقسام.
- كيف تتجنب تكراره؟
- اختر التقسيم من الاستعلام والاحتفاظ الفعليين.
اختبر فهمك
1. أين ينتمي 2026-11-01 مع قسم أكتوبر من 2026-10-01 إلى 2026-11-01؟
اعرض الحل المشروح
لا ينتمي لأكتوبر لأن النهاية غير شاملة. يحتاج نوفمبر أو افتراضياً مناسباً وإلا يفشل الإدخال. اختبر آخر يوم مشمول وأول مستبعد؛ تمنع القاعدة تداخل الشهور وتوضح ملكية الحد.
2. يبحث التقرير كل التاريخ بشفرة تتبع دون تاريخ. هل يضمن التقسيم الشهري سرعة؟
اعرض الحل المشروح
لا؛ قد تفحص الخطة أقساماً كثيرة يحتاج كل منها وصولاً مناسباً. قارن الكلفة بفائدة الدورة، وادرس عقداً أو بحثاً مستقلاً مبرراً دون إضافة تاريخ يسقط تاريخاً مطلوباً بصمت.
أهم ما تعلمته
- يجب اتفاق الحدود والتفرد ودورة الحياة.
- الاستبعاد خاصية للشروط لا وعد سرعة عام.