התצוגה JOBS_TIMELINE

התצוגה INFORMATION_SCHEMA.JOBS_TIMELINE מכילה מטא-נתונים של BigQuery כמעט בזמן אמת לפי פרוסת זמן, לכל המשימות שנשלחו בפרויקט הנוכחי. התצוגה הזו מכילה משימות שפועלות כרגע ומשימות שהושלמו.

ההרשאות הנדרשות

כדי לשלוח שאילתות לתצוגה INFORMATION_SCHEMA.JOBS_TIMELINE, צריך את ההרשאה bigquery.jobs.listAll לניהול זהויות והרשאות גישה (IAM) בפרויקט. כל אחד מהתפקידים הבאים שמוגדרים מראש ב-IAM כולל את ההרשאה הנדרשת:

  • Project Owner
  • אדמין של BigQuery

במאמר בקרת גישה באמצעות IAM יש מידע נוסף על הרשאות ב-BigQuery.

סכימה

כששולחים שאילתה לתצוגות של INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*, תוצאות השאילתה מכילות שורה אחת לכל שנייה של ביצוע של כל משימה ב-BigQuery. כל תקופה מתחילה במרווח של שנייה שלמה ונמשכת בדיוק שנייה אחת.

הסכימה של התצוגה INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* היא:

שם העמודה סוג נתונים ערך
period_start TIMESTAMP שעת ההתחלה של התקופה הזו.
period_slot_ms INTEGER אלפיות השנייה של מיקום מודעה שנצרכו בתקופה הזו.
project_id STRING (עמודת אשכולות) מזהה הפרויקט.
project_number INTEGER מספר הפרויקט.
user_email STRING (עמודת אשכול) כתובת האימייל או חשבון השירות של המשתמש שהריץ את המשימה.
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 אם המשימה הופעלה עם הזמנה שמשתמשת בהתאמה אוטומטית לעומס (autoscaling) ויש לה אפס משבצות בסיסיות.
period_estimated_runnable_units INTEGER יחידות עבודה שאפשר לתזמן באופן מיידי בתקופה הזו. יחידות קיבולת נוספות ליחידות העבודה האלה מאיצות את השאילתה, בתנאי שאף שאילתה אחרת בהזמנה לא זקוקה ליחידות קיבולת נוספות.
transaction_id STRING המזהה של הטרנזקציה שבה המשימה הזו הופעלה, אם יש כזו.
global_query_info RECORD מידע על שאילתה עם אחזור נתונים גלובלי. מכיל את השדות הבאים:
  • ‫parent_job_id: המזהה של משימת ההורה של השאילתה עם אחזור נתונים גלובלי באזור הראשי.
  • ‫parent_job_location: המיקום של משימת ההורה של השאילתה עם אחזור נתונים גלובלי.
  • ‫remote_regions: מערך של אזורים מרוחקים שהשאילתה עם אחזור הנתונים הגלובלי מפנה אליהם.
copy_job_statistics RECORD נתונים סטטיסטיים של משימת העתקה.

כדי לשמור על יציבות, מומלץ לציין במפורש את העמודות בשאילתות של סכימת המידע במקום להשתמש בתו כללי לחיפוש (SELECT *). ציון מפורש של העמודות מונע את קריסת השאילתות אם הסכימה הבסיסית משתנה.

שמירת נתונים

בתצוגה הזו מופיעות משימות שפועלות, וגם היסטוריית המשימות מ-180 הימים האחרונים. אם פרויקט מועבר לארגון (או שאין לו ארגון או שהוא מועבר מארגון אחר), אי אפשר לגשת למידע על המשימות שנוצרו לפני תאריך ההעברה דרך התצוגה INFORMATION_SCHEMA.JOBS_TIMELINE, כי בתצוגה הזו נשמרים רק נתונים שנוצרו החל מתאריך ההעברה.

היקף ותחביר

שאילתות בתצוגה הזו חייבות לכלול מזהה אזור. אם לא מציינים מזהה אזורי, המטא-נתונים מאוחזרים מכל האזורים. בטבלה הבאה מוסבר היקף האזור של התצוגה הזו:

שם התצוגה המפורטת היקף המשאבים היקף האזור
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] רמת הפרויקט REGION
מחליפים את הערכים בשדות הבאים:
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance (אופציונלי). אם לא מציינים פרויקט, המערכת משתמשת בפרויקט שמוגדר כברירת מחדל.
  • ‫REGION: כל שם של אזור של מערך נתונים. לדוגמה, `region-us`.

דוגמאות

כדי להריץ את השאילתה בפרויקט אחר, שהוא לא פרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט בפורמט הבא:

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW

לדוגמה, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE.

בדוגמה הבאה מחושב ניצול ה-slots בכל שנייה ביום האחרון:

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;

התוצאה אמורה להיראות כך:

+---------------------+---------------+
|    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 = "…". במשימות של סקריפטים, המשימה הראשית מדווחת גם על השימוש הכולל ב-slots של המשימות המשניות שלה. כדי למנוע ספירה כפולה, צריך להשתמש ב-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;

התוצאה אמורה להיראות כך:

+---------------------+---------+---------+
|    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);

התוצאה אמורה להיראות כך:

+------------------+
| job_id | slot_ms |
+------------------+
| job_1  | 2415176 |
| job_2  | 4417245 |
| job_3  |  427416 |
| job_4  | 1458122 |
+------------------+

התאמה של אופן השימוש במשבצות לפי תרשימי המשאבים של האדמין

אתם יכולים להשתמש בתרשימי משאבים אדמיניסטרטיביים כדי לעקוב אחרי תקינות הארגון, השימוש ב-slots וביצועי המשימות ב-BigQuery לאורך זמן. השאילתה הבאה שולפת מהתצוגה INFORMATION_SCHEMA.JOBS_TIMELINE ציר זמן של שימוש ב-slots במרווחים של שעה, בדומה למידע שזמין בתרשימי המשאבים של הניהול.

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 |
+-------------------------------+