Cost-Based Optimizer (CBO)

ה-Cost-Based Optimizer (מייעל מבוסס עלויות) הוא ה"מוח" המרכזי של כל מסד נתונים רלציוני מודרני (כמו PostgreSQL, Oracle, SQL Server, MySQL). התפקיד שלו הוא לקחת את שאילתת ה-SQL שכתבת, לחשוב על כמה דרכים שונות לבצע אותה (Execution Plans), לחשב את העלות (Cost) של כל דרך, ולבחור את המסלול הזול והמהיר ביותר לביצוע.

איך ה-CBO עובד מאחורי הקלעים?

כשנריץ שאילתת SQL, יש אולי 5 או 10 דרכים שונות לשלוף את הנתונים (למשל: האם לעשות Table Scan? איזה אינדקס לבחור? באיזה סדר לחבר בין הטבלאות Nested Loop או Hash Join?). ה-CBO עובר במסע קבלת החלטות הבא:

על בסיס מה ה-CBO מקבל החלטות?

ה-CBO מקבל החלטות על סמך סטטיסטיקות ששמורות במסד הנתונים על הטבלאות והאינדקסים שלהן.

הסטטיסטיקות שמורות בתוך מסד הנתונים עצמו, בתוך טבלאות מערכת פנימיות (System Catalogs / Metadata / System Tables) שמנוהלות אוטומטית על ידי הדאטה בייס. משתמשים רגילים לרוב לא יכולים (ואסור להם) לגעת בטבלאות האלו ישירות, אבל מסד הנתונים קורא אותן בכל פעם כששאילתא מורצת כדי שה-CBO יוכל לבנות את תוכנית הביצוע האופטימלית.

סטטיסטיקות אלו כוללות:

⚠️ שימו לב!

אם הסטטיסטיקות בטבלה שלנו לא מעודכנות (למשל כי נוספו מיליון שורות חדשות ומסד הנתונים עוד לא עשה ANALYZE או UPDATE STATISTICS), ה-CBO יעשה חישובים שגויים לחלוטין, יבחר תוכנית ביצוע גרועה (Execution Plan לא אופטימלי), והשאילתא עלולה לקרוס או לרוץ שעות.

מעניין אותך לראות את הסטטיסטיקות האחרונות שיש לדאטה בייס? ישנה פקודה שנותנת לנו הצצה פנימה ב-SQL:

DBCC SHOW_STATISTICS ('users', 'IX_Users_Email');

איך הסטטיסטיקות האלו מתעדכנות? (The Update Process)

הסטטיסטיקות אינן מתעדכנות באופן אוטומטי ושקוף, על כל שורה ושורה שמוסיפים או מוחקים; כי זה היה זולל משאבי מעבד ודיסק עצומים בזמן אמת. במקום זאת, הן מתעדכנות בכמה דרכים:

UPDATE STATISTICS my_table;

נרצה לראות מה ה-CBO מצא לנו כתוכנית האולטימטיבית עבור השאילתא שלנו? נשתמש ב-EXPLAIN. ניתן לראות הרחבה על הנושא כאן:explain

🏠 Back to Orly's Code Corner