هذا المقال يتطلب مستوى: محترف
HypoPG: اختبر تأثير الـ Index في PostgreSQL قبل ما تعمله فعلياً
لو عندك جدول 100 مليون صف وكل CREATE INDEX جديد ممكن يقفل الإنتاج 6 ساعات أو يأكل 38 جيجا قرص في الفاضي، HypoPG بيوفّر طريقة لإنشاء Index وهمي يظهر للـ Query Planner كأنه موجود. تقدر تشغّل EXPLAIN وتعرف لو الـ Planner هيستخدمه فعلاً، قبل ما تدفع أي تكلفة على القرص أو على الـ workload.
المشكلة باختصار
الـ CREATE INDEX على جدول كبير مكلف. حتى مع CONCURRENTLY اللي بيمنع القفل الكامل للجدول، الـ operation بياخد ساعات وبيستهلك I/O ضخم. الأسوأ من ده: في حالات كتيرة الـ Query Planner ما بيختارش الـ Index الجديد أصلاً، لأنه شايف إن الـ Seq Scan أرخص في حالته أو لأن الـ WHERE clause مش بيتطابق مع ترتيب الأعمدة. النتيجة: دفعت 4 ساعات downtime وما تحسّنش حاجة.
المفهوم بمثال للمبتدئين
تخيّل إنك مهندس ديكور هتنقل دولاب 4 متر من أوضة لأوضة. عندك خياران: تشيل الدولاب فعلياً مع 3 عمّال وتجرّب لو هيدخل من الباب — لو ما دخلش هترجّعه تاني وتدفع الأجرة وضايع 4 ساعات. أو تجيب ميزان شريط وتقيس عرض الباب وارتفاع الدولاب في 30 ثانية، تعرف الإجابة من غير ما تلمس قطعة واحدة.
HypoPG هو الميزان الشريط. الـ CREATE INDEX الفعلي هو نقل الدولاب. الاتنين بيدّوك نفس الإجابة (هيتفعّل الـ Index ولا لأ)، بس واحد فيهم بيكلّفك 80 مللي ثانية والتاني بيكلّفك 4 ساعات.
التعريف العلمي الدقيق
HypoPG هو PostgreSQL extension طوّره Julien Rouhaud في 2015 ومدعوم حتى PostgreSQL 17 (version 1.4 من الـ extension). الـ extension بيستغل آلية الـ planner hooks في PostgreSQL ليضيف entries في الـ in-memory representation للـ system catalog (تحديداً pg_class و pg_index) داخل الـ session الحالية فقط.
الـ Query Planner بيتعامل مع الـ hypothetical indexes كأنها indexes حقيقية ويحسب الـ cost estimate بناءً على الـ statistics الموجودة في pg_statistic. مفيش بايت واحد بينكتب على القرص، ومفيش lock بياخد على الجدول. بمجرد ما تقفل الـ session، كل الـ hypothetical indexes بتختفي تلقائياً.
الإعداد والتثبيت
# على Ubuntu/Debian مع PostgreSQL 16
sudo apt install postgresql-16-hypopg
# على macOS مع Homebrew
brew install hypopg
# على Docker
docker exec -it pg16 apt install -y postgresql-16-hypopg
# تفعيل الـ extension داخل DB
psql -d production -c "CREATE EXTENSION hypopg;"مثال تنفيذي: جدول طلبات 98 مليون صف
عندنا جدول orders فيه 98 مليون صف. الـ query ده بياخد 4.8 ثانية في إنتاج فعلي: