مدل ۴ میلیاردی که پلنهای پستگرس رو سریعتر کرد
خلاصهٔ کاملتر
نویسنده با یه سؤال قدیمی شروع میکنه: بهینهسازهای کوئری واقعاً چقدر خوبن؟ Leis و همکارانش سال ۲۰۱۵ این رو پرسیدن و ده سال بعد دوباره پرسیدن، و به گفتهٔ نویسنده جواب هر دو بار این بوده که هنوز جای کار زیادی هست. کاری که این پست انجام میده اینه: یه مدل متنباز ۴ میلیارد پارامتری رو با supervised fine-tuning و بعد یادگیری تقویتی agentic آموزش داده تا پلنهایی بسازه که از پلن پیشفرض پستگرس سریعتر باشن، و نتیجه ۴۴.۷٪ کاهش تأخیر روی ۱۱۳ کوئری بوده.
چرا کار سختیه؟ چون join ordering، یعنی تصمیم دربارهٔ اینکه جدولها به چه ترتیبی به هم جوین بشن، ثابت شده NP-hard هست. نویسنده با یه مثال از دیتاست IMDb نشون میده که با فقط سه جدول و با حساب کردن سه الگوریتم جوین و چهار نوع اسکن، ۴۶۰۸ راه مختلف برای اجرای همون یه کوئری وجود داره. پستگرس همهشون رو بررسی نمیکنه و با برنامهنویسی پویا (و برای کوئریهای با ۱۲ جوین به بالا یه الگوریتم ژنتیک) فضای جستوجو رو هرس میکنه.
نکتهٔ اصلی اینجاست که پستگرس موقع پلنریزی نمیتونه تعداد واقعی سطرها رو بشماره، چون شمردن یعنی اجرا کردن. پس از آمار جدول pg_statistic تخمین میزنه و فرض میکنه دادهها یکنواخت پخش شدن. این فرض وقتی بشکنه، بد میشکنه: اگه اون ۵٪ شرکت ژاپنی در عمل نصف فیلمها رو ساخته باشن، تخمین اولین جوین چند برابر خطا میده و این خطا تو کل درخت جوین پخش میشه.
چون نمیشه مدل هزینهٔ پستگرس رو بدون دست زدن به سورسش عوض کرد، نویسنده سراغ افزونهٔ pg_hint_plan رفته؛ افزونهای که بهت اجازه میده با یه کامنت ساختاریافته بالای کوئری، نوع جوین یا نوع اسکن رو به پستگرس دیکته کنی. استدلالش هم اینه که این کار برای کوئریهای تحلیلی سنگینی میارزه که هزاران بار اجرا میشن: هزینهٔ آموزش یه بار پرداخت میشه و روی همهٔ اجراها سرشکن میشه، نه برای کوئریهای یکباره.
برای اجرا، مدل empero-ai/Qwen3.8-4B-Distill انتخاب شده و یه harness سبک به اسم qo-agent با شش ابزار (از جمله بررسی ساختار جدول، گرفتن آمار ستونها و ارزیابی یه پلن کاندید با زمانگیری واقعی) دورش نوشته شده. بنچمارک هم JOB هست با ۱۱۳ کوئری از ۳۳ قالب. به گفتهٔ نویسنده، مرحلهٔ RL بین دو ماشین تقسیم شده (vLLM و ترینر روی یه نود اجارهای با دو H100 و چهار کانتینر پستگرس روی میز خودش) و یه نسخهٔ سفارشی از GRPO برای امتیازدهی تو این محیط پرنویز طراحی شده.
نکات کلیدی:
- روی ۱۱۳ کوئری پرجوین بنچمارک JOB، تأخیر ۴۴.۷٪ کاهش پیدا کرده.
- مدل پایه یه نسخهٔ ۴ میلیارد پارامتری متنبازه که در ابتدا برای ۹۹ تا از ۱۱۳ کوئری هیچ پلن معتبری تولید نمیکرد.
- join ordering مسئلهای NP-hard هست و برای یه کوئری سهجدولی ۴۶۰۸ حالت اجرا وجود داره.
- پستگرس از ۱۲ جوین به بالا به جای برنامهنویسی پویا از الگوریتم ژنتیک استفاده میکنه.
- هدایت پلن با افزونهٔ pg_hint_plan انجام شده، نه با تغییر مدل هزینهٔ خود پستگرس.
- به گفتهٔ نویسنده، حدود ۵۰۰ مسیر اجرای عامل GPT-6 Astra برای off-policy distillation به کار رفته.




