מבוא לאופטימיזציה של ביצועי שאילתות
במאמר הזה מוסבר על טכניקות אופטימיזציה שיכולות לשפר את ביצועי השאילתות ב-BigQuery. באופן כללי, שאילתות שמבצעות פחות פעולות מניבות ביצועים טובים יותר. הם פועלים מהר יותר וצורכים פחות משאבים, מה שיכול להוביל לעלויות נמוכות יותר ולפחות כשלים.
ביצועי השאילתה
כדי להעריך את הביצועים של שאילתות ב-BigQuery, צריך להתייחס לכמה גורמים:
- נתוני קלט ומקורות נתונים (I/O): כמה בייטים השאילתה קוראת?
- תקשורת בין צמתים (ערבוב): כמה בייטים השאילתה מעבירה לשלב הבא? כמה בייטים מועברים מהשאילתה לכל משבצת?
- חישוב: כמה עבודת מעבד נדרשת לשאילתה?
- פלטים (יצירת תצוגה חומרית): כמה בייטים נכתבים על ידי השאילתה?
- קיבולת ופעולות בו-זמניות: כמה משבצות זמינות וכמה שאילתות אחרות פועלות בו-זמנית?
- מבני השאילתות: האם השאילתות שלכם פועלות לפי השיטות המומלצות של SQL?
כדי להעריך שאילתות ספציפיות או לבדוק אם יש תחרות על משאבים, אתם יכולים להשתמש ב-Cloud Monitoring או בתרשימי המשאבים של ניהול BigQuery כדי לעקוב אחרי צריכת המשאבים של משימות BigQuery לאורך זמן. אתם יכולים גם להשתמש ב-Gemini Cloud Assist כדי לנתח את המשימות. אם זיהיתם שאילתה איטית או שאילתה שצורכת הרבה משאבים, תוכלו להתמקד באופטימיזציה של הביצועים של השאילתה הזו.
אפשר להאיץ חלק ממבני השאילתות, במיוחד כאלה שנוצרו על ידי כלים של בינה עסקית, באמצעות BigQuery BI Engine. BI Engine הוא שירות מהיר לניתוח נתונים בזיכרון, שמאיץ הרבה שאילתות SQL ב-BigQuery באמצעות שמירה חכמה במטמון של הנתונים שבהם אתם משתמשים הכי הרבה. BI Engine מוטמע ב-BigQuery, כך שלרוב אפשר לשפר את הביצועים בלי לשנות את השאילתות.
כמו בכל מערכת, אופטימיזציה של הביצועים כרוכה לפעמים בפשרות. לדוגמה, שימוש בתחביר SQL מתקדם יכול לפעמים להוסיף מורכבות ולהקשות על אנשים שלא מומחים ב-SQL להבין את השאילתות. בנוסף, השקעת זמן באופטימיזציות קטנות בעומסי עבודה לא קריטיים עלולה להסיט משאבים מפיתוח תכונות חדשות לאפליקציות או מזיהוי אופטימיזציות חשובות יותר. כדי לעזור לכם להשיג את ההחזר הכי גבוה על ההשקעה, מומלץ להתמקד באופטימיזציות של עומסי העבודה שהכי חשובים לצינורות של ניתוח הנתונים.
אופטימיזציה של הקיבולת והמקביליות
ב-BigQuery יש שני מודלים לתמחור של שאילתות: תמחור על פי דרישה ותמחור מבוסס-קיבולת. מודל התמחור על פי דרישה מספק מאגר משותף של קיבולת, והתמחור מבוסס על כמות הנתונים שעובדו על ידי כל שאילתה שהרצתם.
מומלץ להשתמש במודל מבוסס-קיבולת אם רוצים לתקצב הוצאה חודשית עקבית, או אם נדרשת קיבולת גדולה יותר מזו שזמינה במודל על פי דרישה. כשמשתמשים בתמחור לפי קיבולת, מקצים קיבולת ייעודית לעיבוד שאילתות שנמדדת במשבצות זמן. העלות של כל הבייטים שעובדו כלולה במחיר שמבוסס על קיבולת. בנוסף להתחייבויות קבועות ל-slots, אתם יכולים להשתמש בslots להתאמה אוטומטית לעומס, שמספקים קיבולת דינמית בהתאם לעומס העבודה של השאילתות.
הביצועים של שאילתות שמופעלות שוב ושוב על אותם נתונים יכולים להשתנות, והשינוי בדרך כלל גדול יותר בשאילתות שמשתמשות במשבצות על פי דרישה מאשר בשאילתות שמשתמשות בהזמנות של משבצות.
במהלך עיבוד שאילתת SQL, BigQuery מפרק את יכולת החישוב שנדרשת להרצת כל שלב בשאילתה למשבצות זמן. BigQuery קובע באופן אוטומטי את מספר השאילתות שיכולות לפעול בו-זמנית, באופן הבא:
- מודל על פי דרישה: מספר המשבצות שזמינות בפרויקט
- מודל מבוסס-קיבולת: מספר המשבצות שזמינות בהזמנה
שאילתות שדורשות יותר משבצות ממה שזמין נכנסות לתור עד שמשאבי העיבוד מתפנים. אחרי ששאילתה מתחילה לפעול, BigQuery מחשב כמה משבצות נדרשות לכל שלב בשאילתה, על סמך הגודל והמורכבות של השלב ומספר המשבצות הזמינות. ב-BigQuery נעשה שימוש בטכניקה שנקראת תזמון הוגן, כדי לוודא שלכל שאילתה יש מספיק קיבולת להתקדם.
גישה ליותר משבצות לא תמיד מובילה לביצועים מהירים יותר של שאילתה.
עם זאת, מאגר גדול יותר של משבצות יכול לשפר את הביצועים של שאילתות גדולות או מורכבות, וגם את הביצועים של עומסי עבודה עם רמת בו-זמניות גבוהה. כשמגדילים את הקיבולת על ידי שינוי של הקצאות ה-slots או מגבלות ההתאמה האוטומטית לעומס, יכול להיות שהמתזמן של BigQuery יקצה יותר slots לשאילתות ספציפיות כדי למקסם את ההקבלה ולהפחית את זמן האחזור. יכול להיות שגם סך הזמן של המשבצות (total_slot_ms) שנדרש לשאילתות יגדל, כי יותר משבצות מבצעות עבודה בו-זמנית. זה מייצג את הפשרה הצפויה בין עלות לביצועים: השאילתות פועלות מהר יותר, אבל צורכות יותר זמן חריץ.
כדי לשפר את ביצועי השאילתות, אתם יכולים לשנות את הזמנות ה-slots או להגדיר מגבלה גבוהה יותר להתאמה אוטומטית לעומס (autoscaling) של ה-slots. אתם יכולים גם להשתמש ב-Gemini Cloud Assist כדי לנהל את ההזמנות והקיבולת באמצעות הנחיות בשפה טבעית.
תוכנית לביצוע שאילתה ותרשים הרצה
בכל פעם שמריצים שאילתה, BigQuery יוצר תוכנית לביצוע שאילתה. כדי לבצע אופטימיזציה יעילה של שאילתות, חשוב מאוד להבין את התוכנית הזו. תוכנית השאילתה כוללת נתוני ביצוע כמו מספר הבייטים שנקראו וזמן המשבצת שנצרך. תוכנית לביצוע שאילתה כוללת גם פרטים על השלבים השונים של ההרצה, שיכולים לעזור לכם לאבחן את הביצועים של השאילתה ולשפר אותם. תרשים ביצוע שאילתה מספק ממשק גרפי לצפייה בתוכנית לביצוע שאילתה ולאבחון בעיות בביצועים שלה.
אפשר גם להשתמש ב-שיטת ה-API jobs.get או בתצוגה INFORMATION_SCHEMA.JOBS כדי לאחזר את המידע על התוכנית לביצוע השאילתה ועל ציר הזמן. המידע הזה משמש את BigQuery Visualizer, כלי בקוד פתוח שמציג באופן חזותי את זרימת שלבי הביצוע במשימה של BigQuery.
כש-BigQuery מריץ משימת שאילתה, הוא ממיר את הצהרת ה-SQL הדקלרטיבית לתרשים של הרצה. התרשים הזה מחולק לסדרה של שלבי שאילתה, שכל אחד מהם מורכב מקבוצות מפורטות יותר של שלבי ביצוע. כדי להריץ את השאילתות האלה, BigQuery משתמש בארכיטקטורה מקבילה ומבוזרת מאוד. השלבים ב-BigQuery יוצרים מודל של יחידות העבודה שהרבה עובדים פוטנציאליים יכולים לבצע במקביל. השלבים מתקשרים ביניהם באמצעות ארכיטקטורת ערבוב מהירה ומבוזרת.
כדי להעריך כמה משאבי מחשוב נדרשים להרצת שאילתה, אפשר לבדוק את המספר הכולל של שניות יחידות הקיבולת שהשאילתה צורכת. ככל שמספר שניות ה-slot נמוך יותר, כך המצב טוב יותר, כי זה אומר שיש יותר משאבים זמינים לשאילתות אחרות שפועלות באותו פרויקט באותו זמן.
גרף הביצוע של השאילתה יכול לעזור לכם להבין איך BigQuery מבצע שאילתות, ואם שלבים מסוימים תופסים חלק גדול מניצול המשאבים. לדוגמה, שלב JOIN שיוצר הרבה יותר שורות פלט משורות קלט עשוי להצביע על הזדמנות לסנן בשלב מוקדם יותר בשאילתה.
עם זאת, אופי השירות המנוהל מגביל את האפשרות לפעול ישירות על סמך חלק מהפרטים. במאמר שיפור חישוב השאילתות מפורטות שיטות מומלצות לשיפור הביצועים וההרצה של שאילתות.
המאמרים הבאים
- איך פותרים בעיות בהרצת שאילתות באמצעות יומני הביקורת של BigQuery
- טכניקות נוספות לניהול עלויות ב-BigQuery
- אפשר לראות מטא-נתונים כמעט בזמן אמת לגבי משימות BigQuery באמצעות התצוגה
INFORMATION_SCHEMA.JOBS. - איך עוקבים אחרי השימוש ב-BigQuery באמצעות דוחות של טבלאות מערכת ב-BigQuery