JOBS_TIMELINE 뷰

INFORMATION_SCHEMA.JOBS_TIMELINE 뷰에는 현재 프로젝트에 제출된 모든 작업의 시간 구획별로 거의 실시간에 가까운 BigQuery 메타데이터가 포함됩니다. 이 뷰에는 현재 실행 중인 작업과 완료된 작업이 포함됩니다.

필수 권한

INFORMATION_SCHEMA.JOBS_TIMELINE 뷰를 쿼리하려면 프로젝트에 대한 bigquery.jobs.listAll Identity and Access Management(IAM) 권한이 필요합니다. 사전 정의된 다음 IAM 역할에는 각각 필수 권한이 포함되어 있습니다.

  • 프로젝트 소유자
  • BigQuery 관리자

BigQuery 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

스키마

INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* 뷰를 쿼리하면 쿼리 결과에는 모든 BigQuery 작업 실행 내역(초 단위)에 대한 행 하나가 포함됩니다. 각 기간은 1초 간격으로 시작하고 정확히 1초 동안 지속됩니다.

INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* 뷰에는 다음과 같은 스키마가 있습니다.

열 이름 데이터 유형
period_start TIMESTAMP 이 기간의 시작 시간
period_slot_ms INTEGER 이 기간 동안 사용된 슬롯(밀리초)
project_id STRING (클러스터링 열) 프로젝트의 ID
project_number INTEGER 프로젝트의 번호
user_email STRING (클러스터링 열) 작업을 실행한 사용자의 이메일 주소 또는 서비스 계정
job_id STRING 작업의 ID. 예를 들면 bquxjob_1234입니다.
job_type STRING 작업의 유형. QUERY, LOAD, EXTRACT, COPY, null일 수 있습니다. 작업 유형 null은 스크립트 작업 문 평가 또는 구체화된 뷰 새로고침과 같은 내부 작업을 나타냅니다.
statement_type STRING 유효한 경우 쿼리 문의 유형. 예시: SELECT, INSERT, UPDATE, DELETE.
priority STRING 이 작업의 우선순위 유효한 값은 INTERACTIVEBATCH입니다.
parent_job_id STRING 상위 작업의 ID입니다(있는 경우).
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 선택한 기간의 셔플 사용량 비율
period_estimated_runnable_units INTEGER 이 기간에 즉시 예약할 수 있는 작업 단위입니다. 이러한 작업 단위의 추가 슬롯은 예약에 있는 다른 쿼리에 추가 슬롯이 필요하지 않은 한 쿼리를 가속화합니다.
transaction_id STRING 이 작업이 실행된 트랜잭션의 ID입니다(있는 경우). (미리보기)

데이터 보관

이 뷰에는 현재 실행 중인 작업과 지난 180일 동안의 작업 기록이 포함되어 있습니다.

범위 및 문법

이 뷰에 대한 쿼리에는 리전 한정자가 있어야 합니다. 리전 한정자를 지정하지 않으면 모든 리전에서 메타데이터가 검색됩니다. 다음 표에는 이 뷰의 리전 범위가 나와 있습니다.

뷰 이름 리소스 범위 리전 범위
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] 프로젝트 수준 REGION
다음을 바꿉니다.

  • (선택사항) PROJECT_ID: Google Cloud 프로젝트의 ID입니다. 지정하지 않으면 기본 프로젝트가 사용됩니다.

  • REGION: 모든 데이터 세트 리전 이름입니다. 예를 들면 `region-us`입니다.

  • 예시

    기본 프로젝트가 아닌 프로젝트에 대해 쿼리를 실행하려면 다음 형식으로 프로젝트 ID를 추가합니다.

    `PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
    ; 예를 들면 다음과 같습니다. `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE.

    다음 예시에서는 마지막 날짜의 슬롯 사용률을 1초마다 계산합니다.

    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 작업의 수

    기본 프로젝트가 아닌 프로젝트에 대해 쿼리를 실행하려면 다음 형식으로 프로젝트 ID를 추가합니다.

    `PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
    ; 예를 들면 다음과 같습니다. `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE.

    다음 예시에서는 마지막 날짜의 RUNNINGPENDING 작업 수를 1초마다 계산합니다.

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

    예시: 특정 시점의 작업별 리소스 사용량

    기본 프로젝트가 아닌 프로젝트에 대해 쿼리를 실행하려면 다음 형식으로 프로젝트 ID를 추가합니다.

    `PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
    ; 예를 들면 다음과 같습니다. `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS.

    다음 예시에서는 특정 시점에서 실행되는 모든 작업의 job_id를 1초 동안 사용한 리소스량과 함께 반환합니다.

    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';

    결과는 다음과 비슷합니다.

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

    예시: 관리 리소스 차트의 슬롯 사용 동작 일치

    관리 리소스 차트를 사용하여 시간 경과에 따른 조직의 상태, 슬롯 사용량, BigQuery 작업 성능을 모니터링할 수 있습니다. 다음 예시는 관리 리소스 차트에 사용할 수 있는 정보와 비슷하게 INFORMATION_SCHEMA.JOBS_TIMELINE 뷰에서 1시간 간격으로 스롯 사용 타임라인을 쿼리합니다.

    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;