Query Optimization - EXPLAIN, Query Plans
Shopify, 2019: checkout page latency עלתה מ-120ms ל-900ms ב-Black Friday. מיליוני transactions בשעה. הם מצאו שquery אחד שנראה תמים - "get cart items for user" - עושה Seq Scan על table עם 200 מיליון שורות כי statistics לא עודכנו לאחר growth מהיר. פתרון: VACUUM ANALYZE, עדכון index, שינוי query. 15 דקות של עבודה שחסכו להם Black Friday שלם.
Query Optimization הוא חצי מדע וחצי אמנות. ה-Query Planner של PostgreSQL עושה עבודה מצוינת - אבל לא תמיד. הוא עושה assumptions על distribution של הנתונים, יש לו statistics שיכולות להיות stale, ולפעמים הוא פשוט בוחר plan לא אופטימלי. EXPLAIN ANALYZE הוא הכלי שמאפשר לכם לראות מה הוא עושה ולמה.
ה-Query Planner של PostgreSQL עובד עם cost-based optimization: הוא מייצר כמה query plans אפשריים, מחשב את העלות המשוערת של כל אחד (בyחידות arbitrary שמבוססות על disk I/O, CPU), ובוחר את הזול ביותר. הבעיה מגיעה כשה-statistics לא מדויקות - הplanner מחשב עלויות על בסיס numbers שגויים ומגיע ל-plan גרוע. זה בדיוק מה שקרה ב-Shopify: statistics שלא עודכנו אמרו לplanner שה-table קטן, הוא בחר Seq Scan, והtable בפועל היה ענק.
ה-Query Planner הוא תוכנה שמנסה לפתור optimization problem עם limited information. הוא יודע את גודל כל table, distribution של values בכל column (statistics), ואת ה-available indexes. הוא לא יודע מה ה-query הבא יהיה, ולא יכול לrun benchmarks על הdata האמיתי לפני שמחזיר תוצאה. אז הוא עושה educated guesses. כשה-guesses נכונות - perfect. כשלא, EXPLAIN ANALYZE מגלה את הפער. כ-developer, התפקיד שלך הוא לתת לplanner information טובה: indexes, statistics מעודכנות, ולפעמים query rewrites שעוזרות לו להבין את הintent.
הפער בין developer שיכול לקרוא EXPLAIN ANALYZE לdeveloper שלא יכול הוא לרוב הפער של כמה שעות עבודה בשבוע. developer שיודע לפרש query plan יכול לזהות בעיה ב-5 דקות שבלי הכישור הזה תיקח שעות. EXPLAIN ANALYZE הוא אחד הכלים הimmediate-value הגבוהה ביותר שיש ללמוד ב-PostgreSQL. זה לא rocket science - זה קריאת output ברורה שמספרת בדיוק מה הdatabase עושה ומה עלה כמה.