قاعدة بيانات أوراكل / المتقدم: تطور آمن وقابل للتعافي / الدرس 14
التقسيم واستبعاد الأجزاء ودورة البيانات
قيّم التنظيم الزمني كتصميم لدورة الحياة بحدود وآثار فهارس واستحقاقات واضحة.
في هذه الصفحة
أهداف الدرس
- حلّل حدود النطاق واستبعاد الأجزاء.
- اربط الاحتفاظ وقواعد التفرّد بتصميم الفهارس.
ابدأ بمشكلة دورة حياة
قد يحتفظ جدول المسوح بالأشهر الحديثة للتحقيق التشغيلي وبالأقدم لأرشيف أبطأ. يقسم التقسيم كائناً منطقياً واحداً إلى أجزاء قابلة للإدارة ولا يحوّله إلى قواعد تطبيق منفصلة. اسأل هل تختار الاستعلامات نطاقاً زمنياً محدوداً، وهل يمكن تطبيق الاحتفاظ على فترات كاملة، وهل تعزل الصيانة البيانات القديمة. العدد الكبير وحده لا يثبت الفائدة. تعتمد القدرات والترخيص على عرض أوراكل المحدد، فتحقق من الاستحقاق قبل التجربة ولا تفترض شمول كل خيار في Enterprise Edition.
الحدود العليا غير مشمولة
يسمي VALUES LESS THAN في تقسيم النطاق حداً علوياً غير مشمول. يحتوي p_before_oct ما قبل 1 أكتوبر، وp_oct من 1 أكتوبر إلى ما قبل 1 نوفمبر، ويلتقط p_future اللاحق. لا يثبت اسم الشهر المحتوى؛ الحدود وحدها تفعل. قد يمنع MAXVALUE إخفاق الإدراج خارج النطاق لكنه يحتاج عملية صريحة لتغيير التنظيم مستقبلاً. حدّد معالجة event_time الغائب بـNOT NULL بدلاً من ترك موضعه استثناء غير موثق.
CREATE TABLE scan_history (
scan_id NUMBER NOT NULL, event_time DATE NOT NULL, shipment_id NUMBER NOT NULL
) PARTITION BY RANGE (event_time) (
PARTITION p_before_oct VALUES LESS THAN (DATE '2026-10-01'),
PARTITION p_oct VALUES LESS THAN (DATE '2026-11-01'),
PARTITION p_future VALUES LESS THAN (MAXVALUE)
);
تعريف توضيحي فقط مشروط بالإصدار والصلاحيات والاستحقاق. ينتمي منتصف الليل الحدّي إلى الجزء الذي يبدأ عنده.
يكشف الشرط المفيد مفتاح التقسيم
قد يسمح نطاق event_time نصف المفتوح بتجاوز الأجزاء غير اللازمة. هذا استبعاد أجزاء ويختلف عن استخدام فهرس داخل المتبقي. قد يعقّد تغليف المفتاح بدالة أو تحويل ضمني غير متوافق استراتيجية الوصول. افحص معلومات الأجزاء في الخطة المصرح بها بدلاً من افتراض أن أي شرط يبدو تقويمياً يستبعدها. قد تقود متغيرات الربط إلى استبعاد وقت التنفيذ، فلا يعني غياب أرقام أجزاء حرفية في التقدير الإخفاق وحده. قدّم الصحة والحدود ذات النوع، ثم تحقق من أثر الأداء.
SELECT COUNT(*)
FROM scan_history
WHERE event_time >= DATE '2026-10-01'
AND event_time < DATE '2026-11-01';
يقع المجتمع المقصود في p_oct وفق التعريف السابق. تثبت مراجعة الخطة لا النص وحده سلوك الاستبعاد المختار.
تلبي الفهارس المحلية والعامة احتياجات مختلفة
يتبع الفهرس المحلي تنظيم أجزاء الجدول وقد يجعل صيانة الفترات أكثر استقلالاً. يخدم الفهرس العام أنماط وصول عابرة للأجزاء مع آثار صيانة مختلفة. يحتاج الفهرس المحلي الفريد إلى تضمين مفتاح تقسيم الجدول، ما يغيّر عقد التفرّد إلى مفتاح مركب. إذا وجب تفرّد scan_id عالمياً فلا تضعف القاعدة إلى تفرّد تراكيب event_time. قيّم القيد والفهرس الداعم معاً؛ لا يجوز لتنظيم دورة الحياة أن يعيد تعريف هوية العمل بصمت.
الاحتفاظ عملية أعمال متحقق منها
قد تنتهك إزالة فترة حجزاً قانونياً أو تدمر نافذة مطابقة أو تؤثر في جداول مرتبطة رغم سرعة الأمر. اجرد المفاتيح الخارجية والفهارس والنسخ ومتطلبات الاستعادة والاستخراج قبل الصيانة. تحتاج مبادلة الأجزاء توافقاً بنيوياً وقرارات تحقق متعمدة. لا تقدم الدورة أمراً تدميرياً للصيانة. يجب أن تحدد الخطة الحدود والمجتمع المتوقع وأدلة النسخ المحفوظة وفحوص ما بعد التغيير. تأتي مكاسب الأداء بعد إثبات أن السجلات المقصودة وحدها تتبع سياسة الاحتفاظ.
الأخطاء الشائعة وإصلاحها
ORA-14400
- لماذا يحدث؟
- ليس لمفتاح الإدراج جزء نطاق مطابق.
- كيف تصلحه؟
- راجع الحدود الفعلية وسياسة الأجزاء المستقبلية المعتمدة.
- كيف تتجنب تكراره؟
- اختبر أوقات الحدود والتواريخ المستقبلية قبل كل فترة إدخال.
ORA-14039
- لماذا يحدث؟
- يفتقد فهرس محلي فريد أعمدة تقسيم لازمة.
- كيف تصلحه؟
- طابق متطلب التفرّد العالمي مع التصميم.
- كيف تتجنب تكراره؟
- راجع القيود ومفاتيح التقسيم معاً.
لا يزال التقرير المقسّم يقرأ بيانات مفرطة
- لماذا يحدث؟
- لا يستبعد الشرط أو المسار الأجزاء المقصودة.
- كيف تصلحه؟
- افحص أنواع الشروط وأدلة أجزاء الخطة.
- كيف تتجنب تكراره؟
- قِس فترات ممثلة واحتفظ بمطابقة للصحة.
اختبر فهمك
1. أين يقع event_time = DATE '2026-11-01' في المثال؟
اعرض الحل المشروح
يُستبعد من p_oct لأن حده الأعلى غير مشمول، وينتمي إلى p_future. لا يغيّر الاسم القاعدة. اختبر سجلات عند الحدين وقبلهما وفق دقة العمود بدلاً من اسم الشهر في لوحة العرض.
2. هل تحفظ إضافة event_time إلى مفتاح محلي فريد قاعدة تفرّد scan_id وحده عالمياً؟
اعرض الحل المشروح
ليس وحدها؛ يسمح المركب بـscan_id نفسه مع event_time مختلف. احفظ المتطلب بقيد واستراتيجية فهرس مدعومين وقيّم الصيانة، ولا تضعف الهوية لمجرد إرضاء صياغة الفهرس المحلي.
أهم ما تعلمته
- يجب أن تشكل حدود الأجزاء والتفرّد والاحتفاظ تصميماً متسقاً.
- يتطلب الاستبعاد والاستحقاق أدلة خاصة بالنشر.