תצוגת JOBS_TIMELINE
התצוגה INFORMATION_SCHEMA.JOBS_TIMELINE מכילה מטא-נתונים של BigQuery כמעט בזמן אמת לפי חלוקה לפי זמן לכל העבודות שנשלחו בפרויקט הנוכחי. בתצוגה הזו מופיעות משימות שפועלות כרגע ומשימות שהושלמו.
ההרשאות הנדרשות
כדי לשלוח שאילתה לתצוגה המפורטת INFORMATION_SCHEMA.JOBS_TIMELINE, צריך את ההרשאה bigquery.jobs.listAll לניהול זהויות והרשאות גישה (IAM) בפרויקט.
כל אחד מהתפקידים הבאים שמוגדרים מראש ב-IAM כולל את ההרשאה הנדרשת:
- Project Owner
- BigQuery Admin
מידע נוסף על הרשאות ב-BigQuery זמין במאמר בקרת גישה באמצעות IAM.
סכימה
כשמריצים שאילתה על התצוגות INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*, התוצאות שלה כוללות שורה אחת לכל שנייה של ביצוע של כל משימת BigQuery. כל תקופה מתחילה במרווח של שנייה שלמה ונמשכת בדיוק שנייה אחת.
לתצוגה INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* יש את הסכימה הבאה:
| שם עמודה | סוג נתונים | ערך |
|---|---|---|
period_start |
TIMESTAMP |
שעת ההתחלה של התקופה הזו. |
period_slot_ms |
INTEGER |
מספר אלפיות השנייה של משבצות הזמן שנצרכו בתקופה הזו. |
project_id |
STRING |
(Clustering column) מזהה הפרויקט. |
project_number |
INTEGER |
מספר הפרויקט. |
user_email |
STRING |
(Clustering column) כתובת האימייל או חשבון השירות של המשתמש שהפעיל את העבודה. |
principal_subject |
STRING |
ייצוג מחרוזת של הזהות של הגורם הראשי שהפעיל את המשימה. |
job_id |
STRING |
מזהה המשרה. לדוגמה, bquxjob_1234. |
job_type |
STRING |
סוג המשרה. הערכים האפשריים הם QUERY, LOAD, EXTRACT, COPY או NULL. הערך NULL מציין עבודה ברקע. |
labels |
RECORD |
מערך של תוויות שמוחלות על העבודה כצמדי מפתח/ערך. |
statement_type |
STRING |
סוג הצהרת השאילתה, אם היא תקפה. לדוגמה, SELECT, INSERT, UPDATE או DELETE. |
priority |
STRING |
העדיפות של המשימה הזו. הערכים התקפים כוללים INTERACTIVE ו-BATCH. |
parent_job_id |
STRING |
המזהה של עבודת ההורה, אם יש כזו. |
job_creation_time |
TIMESTAMP |
(עמודת חלוקה) מועד היצירה של העבודה הזו. החלוקה למחיצות מבוססת על זמן UTC של חותמת הזמן הזו. |
job_start_time |
TIMESTAMP |
שעת ההתחלה של העבודה הזו. |
job_end_time |
TIMESTAMP |
שעת הסיום של העבודה הזו. |
state |
STRING |
מצב ההפעלה של העבודה בסוף התקופה הזו. מצבים תקינים כוללים PENDING, RUNNING ו-DONE. |
reservation_id |
STRING |
שם ההזמנה הראשית שהוקצתה לעבודה הזו בסוף התקופה הזו, אם רלוונטי. |
reservation_group_path |
ARRAY<STRING> |
קבוצת ההזמנות שאליה ההזמנה מקושרת.
לדוגמה, אם ההזמנה מקושרת לקבוצה my-group, השדה reservation_group_path מכיל רשימה כמו: [my-group]. |
edition |
STRING |
המהדורה שמשויכת להזמנה שהוקצתה למשרה הזו. מידע נוסף על מהדורות זמין במאמר מבוא למהדורות BigQuery. |
total_bytes_billed |
INTEGER |
אם הפרויקט מוגדר לשימוש בתמחור לפי דרישה, השדה הזה מכיל את סך הבייטים שחויבו על העבודה. אם הפרויקט מוגדר לשימוש בתמחור לפי תעריף קבוע, לא מחויבים על בייטים והשדה הזה הוא רק לצורכי מידע. השדה הזה מאוכלס רק עבור משימות שהושלמו, והוא מכיל את המספר הכולל של בייטים שחויבו עבור משך הזמן הכולל של המשימה. |
total_bytes_processed |
INTEGER |
המספר הכולל של בייטים שעובדו על ידי הג'וב. השדה הזה מאוכלס רק עבור משימות שהושלמו, והוא מכיל את המספר הכולל של בייטים שעברו עיבוד במהלך כל משך הזמן של המשימה. |
error_result |
RECORD |
פרטי השגיאה (אם יש) בתור
ErrorProto.
|
cache_hit |
BOOLEAN |
האם תוצאות השאילתה של העבודה הזו הגיעו ממטמון. |
period_shuffle_ram_usage_ratio |
FLOAT |
יחס השימוש בהפעלה אקראית בטווח הזמן שנבחר. הערך הוא 0.0 אם העבודה רצה עם מקום שמור שמשתמש בהתאמה אוטומטית לעומס ויש לו אפס יחידות קיבולת בסיסיות. |
period_estimated_runnable_units |
INTEGER |
יחידות עבודה שאפשר לתזמן באופן מיידי בתקופה הזו. יחידות קיבולת נוספות ליחידות העבודה האלה יאיצו את השאילתה, בתנאי שאף שאילתה אחרת בהזמנה לא זקוקה ליחידות קיבולת נוספות. |
transaction_id |
STRING |
המזהה של העסקה שבה המשימה הזו הופעלה, אם יש כזו. |
כדי לשמור על יציבות, מומלץ לציין במפורש את העמודות בשאילתות של סכימת המידע, במקום להשתמש בתו כללי (SELECT *). ציון מפורש של העמודות מונע את השבירה של השאילתות אם הסכימה הבסיסית משתנה.
שמירת נתונים
בתצוגה הזו מוצגות משימות שפועלות, יחד עם היסטוריית המשימות מ-180 הימים האחרונים.
אם פרויקט מועבר לארגון (ממצב שבו הוא לא היה שייך לארגון או מארגון אחר), לא ניתן לגשת למידע על משרות שנוצרו לפני תאריך ההעברה דרך התצוגה INFORMATION_SCHEMA.JOBS_TIMELINE, כי התצוגה שומרת רק נתונים שנוצרו החל מתאריך ההעברה.
היקף ותחביר
שאילתות שמופעלות על התצוגה הזו חייבות לכלול מסנן אזור. אם לא מציינים מסווג אזורי, המטא-נתונים מאוחזרים מכל האזורים. בטבלה הבאה מוסבר היקף האזור בתצוגה הזו:
| שם התצוגה | היקף המשאבים | היקף האזור |
|---|---|---|
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] |
ברמת הפרויקט | REGION |
-
אופציונלי:
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . אם לא מציינים פרויקט, המערכת משתמשת בפרויקט שמוגדר כברירת מחדל. -
REGION: כל שם של אזור במערך נתונים. לדוגמה,`region-us`.
דוגמאות
כדי להריץ את השאילתה בפרויקט שאינו פרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט בפורמט הבא:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
לדוגמה, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE.
בדוגמה הבאה מחושב ניצול משבצות הזמן בכל שנייה ביום האחרון:
SELECT period_start, SUM(period_slot_ms) AS total_slot_ms, FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() GROUP BY period_start ORDER BY period_start DESC;
INFORMATION_SCHEMA
התוצאה אמורה להיראות כך:
+---------------------+---------------+ | period_start | total_slot_ms | +---------------------+---------------+ | 2020-07-29 03:52:14 | 122415176 | | 2020-07-29 03:52:15 | 141107048 | | 2020-07-29 03:52:16 | 173335142 | | 2020-07-28 03:52:17 | 131107048 | +---------------------+---------------+
אפשר לבדוק את השימוש במקום שמור מסוים באמצעות WHERE reservation_id = "…". במשימות של סקריפטים, משימת האב מדווחת גם על סך השימוש במשבצות מתוך משימות הצאצא שלה. כדי למנוע ספירה כפולה, צריך להשתמש בפונקציה WHERE statement_type != "SCRIPT" כדי להחריג את עבודת ההורה.
מספר המשימות של RUNNING ושל PENDING לאורך זמן
כדי להריץ את השאילתה בפרויקט שאינו פרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט בפורמט הבא:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
לדוגמה, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE.
בדוגמה הבאה מחושב מספר המשימות RUNNING ו-PENDING בכל שנייה ביום האחרון:
SELECT period_start, SUM(IF(state = "PENDING", 1, 0)) as PENDING, SUM(IF(state = "RUNNING", 1, 0)) as RUNNING FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() GROUP BY period_start;
INFORMATION_SCHEMA
התוצאה אמורה להיראות כך:
+---------------------+---------+---------+ | period_start | PENDING | RUNNING | +---------------------+---------+---------+ | 2020-07-29 03:52:14 | 7 | 27 | | 2020-07-29 03:52:15 | 1 | 21 | | 2020-07-29 03:52:16 | 5 | 21 | | 2020-07-29 03:52:17 | 4 | 22 | +---------------------+---------+---------+
שימוש במשאבים לפי משימות בנקודת זמן ספציפית
כדי להריץ את השאילתה בפרויקט שאינו פרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט בפורמט הבא:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
לדוגמה, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS.
בדוגמה הבאה מוצגות כל המשימות שרצות בנקודת זמן ספציפית, יחד עם השימוש במשאבים שלהן במהלך תקופת השנייה הזו:job_id
SELECT job_id, period_slot_ms FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT WHERE period_start = '2020-07-29 03:52:14' AND (statement_type != 'SCRIPT' OR statement_type IS NULL);
INFORMATION_SCHEMA
התוצאה אמורה להיראות כך:
+------------------+ | job_id | slot_ms | +------------------+ | job_1 | 2415176 | | job_2 | 4417245 | | job_3 | 427416 | | job_4 | 1458122 | +------------------+
התאמה של התנהגות השימוש במשבצות מתוך תרשימי משאבים אדמיניסטרטיביים
אתם יכולים להשתמש בתרשימים של משאבים אדמיניסטרטיביים כדי לעקוב אחרי תקינות הארגון, השימוש במשבצות וביצועי העבודות ב-BigQuery לאורך זמן. בדוגמה הבאה מוצגת שאילתה ששולפת מהתצוגה INFORMATION_SCHEMA.JOBS_TIMELINE ציר זמן של השימוש במשבצת במרווחי שעה, בדומה למידע שזמין בתרשימי המשאבים של האדמין.
DECLARE start_time timestamp DEFAULT TIMESTAMP(START_TIME); DECLARE end_time timestamp DEFAULT TIMESTAMP(END_TIME); WITH snapshot_data AS ( SELECT UNIX_MILLIS(period_start) AS period_start, IFNULL(SUM(period_slot_ms), 0) AS period_slot_ms, DIV(UNIX_MILLIS(period_start), 3600000 * 1) * 3600000 * 1 AS time_ms FROM ( SELECT * FROM `PROJECT_ID.region-US`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT WHERE ((job_creation_time >= TIMESTAMP_SUB(start_time, INTERVAL 1200 MINUTE) AND job_creation_time < TIMESTAMP(end_time)) AND period_start >= TIMESTAMP(start_time) AND period_start < TIMESTAMP(end_time)) AND (statement_type != "SCRIPT" OR statement_type IS NULL) AND REGEXP_CONTAINS(reservation_id, "^PROJECT_ID:") ) GROUP BY period_start, time_ms ), converted_percentiles_data AS ( SELECT time_ms, 100 - CAST(SAFE_DIVIDE(3600000 * 1 * 1 / 1000, COUNT(*)) AS INT64) AS converted_percentiles, FROM snapshot_data GROUP BY time_ms ), data_by_time AS ( SELECT time_ms, IF (converted_percentiles <= 0, 0, APPROX_QUANTILES(period_slot_ms, 100)[SAFE_OFFSET(converted_percentiles)] / 1000) AS p99_slots, SUM(period_slot_ms) / (3600000 * 1) AS avg_slots FROM snapshot_data JOIN converted_percentiles_data AS c USING (time_ms) GROUP BY time_ms, converted_percentiles ) SELECT time_ms, TIMESTAMP_MILLIS(time_ms) AS time_stamp, IFNULL(avg_slots, 0) AS avg_slots, IFNULL(p99_slots, 0) AS p99_slots, FROM ( SELECT time_ms * 3600000 * 1 AS time_ms FROM UNNEST(GENERATE_ARRAY(DIV(UNIX_MILLIS(start_time), 3600000 * 1), DIV(UNIX_MILLIS(end_time), 3600000 * 1) - 1, 1)) AS time_ms ) LEFT JOIN data_by_time USING (time_ms) ORDER BY time_ms DESC;
חישוב אחוז זמן הביצוע שבו הייתה עבודה בהמתנה
כדי להריץ את השאילתה בפרויקט שאינו פרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט בפורמט הבא:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
לדוגמה, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS.
בדוגמה הבאה מוחזר ערך מסוג float שמייצג את אחוז משך הביצוע הכולל של העבודה שבו הערך של period_estimated_runnable_units היה שונה מאפס, כלומר העבודה ביקשה עוד משבצות. ערך גבוה מצביע על כך שהעבודה סבלה מתחרות על משבצות, ואילו ערך נמוך מצביע על כך שהעבודה לא ביקשה משבצות ברוב זמן הביצוע, כלומר לא הייתה תחרות על משבצות או שהתחרות הייתה מינורית.
אם הערך שמתקבל גדול, אפשר לנסות להוסיף עוד מיקומי מודעות כדי לראות את ההשפעה ולהבין אם התחרות על מיקומי מודעות היא צוואר הבקבוק היחיד.
SELECT ROUND(COUNTIF(period_estimated_runnable_units > 0) / COUNT(*) * 100, 1) as execution_duration_percentage FROM `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE job_id = 'my_job_id' GROUP BY job_id
אם אתם יודעים את התאריך של הרצת השאילתה, תוכלו להוסיף לשאילתה פסקה DATE(period_start) = 'YYYY-MM-DD' כדי לצמצם את מספר הבייטים שעוברים עיבוד ולזרז את ההרצה. לדוגמה,
DATE(period_start) = '2025-08-22'.
התוצאה אמורה להיראות כך:
+-------------------------------+ | execution_duration_percentage | +-------------------------------+ | 96.7 | +-------------------------------+