התצוגה JOBS_TIMELINE

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

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

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

  • בעלי הפרויקט
  • אדמין של BigQuery

מידע נוסף על הרשאות ב-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 שם ההזמנה הראשית שהוקצתה לעבודה הזו בסוף התקופה הזו, אם רלוונטי.
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 |
+-------------------------------+