Tampilan JOBS

Tampilan INFORMATION_SCHEMA.JOBS berisi metadata yang mendekati real-time tentang semua tugas BigQuery dalam project saat ini.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan guna membuat kueri tampilan INFORMATION_SCHEMA.JOBS, minta administrator untuk memberi Anda peran IAM BigQuery Resource Viewer (roles/bigquery.resourceViewer) di project Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

Peran yang telah ditentukan ini berisi izin bigquery.jobs.listAll, yang diperlukan untuk membuat kueri tampilan INFORMATION_SCHEMA.JOBS.

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Untuk mengetahui informasi selengkapnya tentang izin BigQuery, lihat Kontrol akses dengan IAM.

Skema

Data pokok dipartisi oleh kolom creation_time serta dikelompokkan menurut project_id dan user_email. Kolom query_info berisi informasi tambahan tentang tugas kueri Anda.

Tampilan INFORMATION_SCHEMA.JOBS memiliki skema berikut:

Nama kolom Data type Nilai
bi_engine_statistics RECORD Jika project dikonfigurasi untuk menggunakan Antarmuka BI Engine SQL, maka kolom ini berisi BiEngineStatistics. Atau NULL.
cache_hit BOOLEAN Apakah hasil kueri tugas ini berasal dari cache. Jika Anda memiliki tugas pernyataan multi-kueri, cache_hit untuk kueri induk Anda adalah NULL.
creation_time TIMESTAMP (Kolom partisi) Waktu pembuatan tugas ini. Partisi didasarkan pada waktu UTC stempel waktu ini.
destination_table RECORD Tabel tujuan untuk hasil, jika ada.
dml_statistics RECORD Jika tugas adalah kueri dengan pernyataan DML, nilainya adalah data dengan kolom berikut:
  • inserted_row_count: Jumlah baris yang disisipkan.
  • deleted_row_count: Jumlah baris yang telah dihapus.
  • updated_row_count: Jumlah baris yang diperbarui.
Untuk semua tugas lainnya, nilainya adalah NULL.
Kolom ini ada dalam tampilan INFORMATION_SCHEMA.JOBS_BY_USER dan INFORMATION_SCHEMA.JOBS_BY_PROJECT.
end_time TIMESTAMP Waktu berakhir tugas ini, dalam milidetik sejak epoch. Kolom ini menunjukkan waktu saat tugas memasuki status DONE.
error_result RECORD Detail error sebagai objek ErrorProto.
job_id STRING ID tugas. Misalnya, bquxjob_1234.
job_stages RECORD Tahap kueri tugas.

Catatan: Nilai kolom ini kosong untuk kueri yang membaca dari tabel dengan kebijakan akses tingkat baris. Untuk mengetahui informasi selengkapnya, lihat praktik terbaik untuk keamanan tingkat baris di BigQuery.

job_type STRING Jenis tugas. Dapat berupa QUERY, LOAD, EXTRACT, COPY, atau NULL. Nilai NULL menunjukkan tugas internal, seperti evaluasi pernyataan tugas skrip atau pemuatan ulang tampilan terwujud.
labels RECORD Array label yang diterapkan ke tugas sebagai pasangan nilai kunci.
parent_job_id STRING ID tugas induk, jika ada.
priority STRING Prioritas tugas ini. Nilai yang valid mencakup INTERACTIVE, dan BATCH.
project_id STRING (Kolom pengelompokkan) ID project.
project_number INTEGER Nomor project.
query STRING Teks kueri SQL. Hanya tampilan JOBS_BY_PROJECT yang memiliki kolom kueri.
referenced_tables RECORD Array tabel yang direferensikan oleh tugas. Hanya diisi untuk tugas kueri yang bukan cache ditemukan.
reservation_id STRING Nama reservasi utama yang ditetapkan untuk tugas ini, dalam format RESERVATION_ADMIN_PROJECT:RESERVATION_LOCATION.RESERVATION_NAME.
Dalam output ini:
  • RESERVATION_ADMIN_PROJECT: nama project Google Cloud yang mengelola reservasi
  • RESERVATION_LOCATION: lokasi pemesanan
  • RESERVATION_NAME: nama pemesanan
session_info RECORD Detail tentang sesi tempat tugas ini dijalankan, jika ada. (Pratinjau)
start_time TIMESTAMP Waktu mulai tugas ini, dalam milidetik sejak epoch. Kolom ini menunjukkan waktu saat tugas bertransisi dari status PENDING ke RUNNING atau DONE.
state STRING Status tugas yang berjalan. Status yang valid mencakup PENDING, RUNNING, dan DONE.
statement_type STRING Jenis pernyataan kueri. Misalnya, DELETE, INSERT, SCRIPT, SELECT, atau UPDATE. Lihat QueryStatementType untuk mengetahui daftar nilai yang valid.
timeline RECORD Linimasa kueri tugas. Berisi snapshot eksekusi kueri.
total_bytes_billed INTEGER Jika project dikonfigurasi untuk menggunakan harga sesuai permintaan, maka kolom ini berisi total byte yang ditagih untuk tugas tersebut. Jika project dikonfigurasi untuk menggunakan harga tetap, Anda tidak akan dikenai biaya untuk byte dan kolom ini hanya bersifat informasi.

Catatan: Nilai kolom ini kosong untuk kueri yang membaca dari tabel dengan kebijakan akses tingkat baris. Untuk mengetahui informasi selengkapnya, lihat praktik terbaik untuk keamanan tingkat baris di BigQuery.

total_bytes_processed INTEGER

Total byte yang diproses oleh tugas.

Catatan: Nilai kolom ini kosong untuk kueri yang membaca dari tabel dengan kebijakan akses tingkat baris. Untuk mengetahui informasi selengkapnya, lihat praktik terbaik untuk keamanan tingkat baris di BigQuery.

total_modified_partitions INTEGER Jumlah total partisi yang diubah oleh tugas. Kolom ini diisi untuk tugas LOAD dan QUERY.
total_slot_ms INTEGER Masukkan milidetik untuk tugas selama keseluruhan durasinya dalam status RUNNING, termasuk percobaan ulang.
transaction_id STRING ID transaksi tempat tugas ini berjalan, jika ada. (Pratinjau)
user_email STRING (Kolom pengelompokan) Alamat email atau akun layanan pengguna yang menjalankan tugas.
query_info.resource_warning STRING Pesan peringatan yang muncul jika penggunaan resource selama pemrosesan kueri berada di atas ambang batas internal sistem.
Tugas kueri yang berhasil dapat mengisi kolom resource_warning. Dengan resource_warning, Anda akan mendapatkan titik data tambahan untuk mengoptimalkan kueri dan menyiapkan pemantauan tren performa kumpulan kueri yang setara menggunakan query_hashes.
query_info.query_hashes.normalized_literals STRING Berisi hash kueri. normalized_literals adalah hash STRING heksadesimal yang mengabaikan komentar, parameter value, UDF, dan literal.
Kolom ini muncul untuk kueri GoogleSQL yang berhasil dan tidak menemukan cache.
query_info.performance_insights RECORD Insight performa untuk tugas.
query_info.optimization_details STRUCT Pengoptimalan berbasis histori untuk tugas.
transferred_bytes INTEGER Total byte yang ditransfer untuk kueri lintas-cloud, seperti tugas transfer lintas-cloud BigQuery Omni.
materialized_view_statistics RECORD Statistik tampilan terwujud yang dipertimbangkan dalam tugas kueri. (Pratinjau)

Saat Anda membuat kueri INFORMATION_SCHEMA.JOBS untuk menemukan ringkasan biaya tugas kueri, kecualikan jenis pernyataan SCRIPT. Jika tidak, beberapa nilai mungkin akan dihitung dua kali. Baris SCRIPT menyertakan nilai ringkasan untuk semua tugas turunan yang dijalankan sebagai bagian dari tugas ini.

Tugas kueri multi-pernyataan

Tugas kueri multi-pernyataan adalah tugas kueri yang menggunakan bahasa prosedural. Tugas kueri multi-pernyataan sering kali menentukan variabel dengan DECLARE atau memiliki pernyataan alur kontrol seperti IF atau WHILE. Saat membuat kueri INFORMATION_SCHEMA.JOBS, Anda mungkin perlu mengenali perbedaan antara tugas kueri multi-pernyataan dan tugas lainnya. Tugas kueri multi-pernyataan memiliki karakteristik berikut:

  • statement_type = SCRIPT
  • reservation_id = NULL
  • Tugas turunan. Setiap tugas turunan dari tugas kueri multi-pernyataan memiliki parent_job_id yang mengarah ke tugas kueri multi-pernyataan itu sendiri. Ini termasuk nilai ringkasan untuk semua tugas turunan yang dijalankan sebagai bagian dari tugas ini. Oleh karena itu, jika Anda membuat kueri INFORMATION_SCHEMA.JOBS untuk menemukan biaya ringkasan tugas kueri, Anda harus mengecualikan jenis pernyataan SCRIPT. Jika tidak, beberapa nilai seperti total_slot_ms mungkin akan dihitung dua kali.

Retensi data

Tabel virtual ini berisi tugas yang sedang berjalan dan histori tugas selama 180 hari terakhir.

Cakupan dan sintaksis

Kueri terhadap tabel virtual ini harus menyertakan penentu region. Tabel berikut menjelaskan cakupan region untuk tabel virtual ini:

Nama tabel virtual Cakupan resource Cakupan region
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS[_BY_PROJECT] Level project REGION
Ganti kode berikut:

  • Opsional: PROJECT_ID: ID project Google Cloud Anda. Jika tidak ditentukan, project default akan digunakan.
  • REGION: nama region set data apa pun. Misalnya, region-us.

Contoh

Untuk menjalankan kueri terhadap project selain project default Anda, tambahkan project ID dalam format berikut:

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
Ganti yang berikut ini:

  • PROJECT_ID: ID project.
  • REGION_NAME: region untuk project Anda.

Misalnya, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT.

Membandingkan Penggunaan Tugas dengan Data Penagihan

Untuk project yang menggunakan penagihan on-demand, Anda dapat menggunakan tampilan INFORMATION_SCHEMA.JOBS untuk meninjau tagihan komputasi selama periode tertentu. Kueri berikut menghasilkan estimasi agregat harian dari TiB yang ditagih dan biaya yang dihasilkan. Bagian batasan menjelaskan kapan estimasi ini mungkin tidak cocok dengan tagihan Anda.

Hanya untuk contoh ini, variabel tambahan berikut harus ditetapkan. Template tersebut dapat diedit di sini untuk kemudahan penggunaan.

  • START_DATE: tanggal paling awal untuk digabungkan (inklusif).
  • END_DATE: tanggal terakhir untuk digabungkan (inklusif).
  • PRICE_PER_TIB: harga sesuai permintaan per TiB yang digunakan untuk estimasi tagihan.
CREATE TEMP FUNCTION isBillable(error_result ANY TYPE)
AS (
  -- You aren't charged for queries that return an error.
  error_result IS NULL
  -- However, canceling a running query might incur charges.
  OR error_result.reason = 'stopped'
);

-- BigQuery hides the number of bytes billed on all queries against tables with
-- row-level security.
CREATE TEMP FUNCTION isMaybeUsingRowLevelSecurity(
  job_type STRING, tib_billed FLOAT64, error_result ANY TYPE)
AS (
  job_type = 'QUERY'
  AND tib_billed IS NULL
  AND isBillable(error_result)
);

WITH
  query_params AS (
    SELECT
      date 'START_DATE' AS start_date,  -- inclusive
      date 'END_DATE' AS end_date,  -- inclusive
  ),
  usage_with_multiplier AS (
    SELECT
      job_type,
      error_result,
      creation_time,
      -- Jobs are billed by end_time in PST8PDT timezone, regardless of where
      -- the job ran.
      EXTRACT(date FROM end_time AT TIME ZONE 'PST8PDT') billing_date,
      total_bytes_billed / 1024 / 1024 / 1024 / 1024 total_tib_billed,
      CASE statement_type
        WHEN 'SCRIPT' THEN 0
        WHEN 'CREATE_MODEL' THEN 50 * PRICE_PER_TIB
        ELSE PRICE_PER_TIB
        END AS multiplier,
    FROM `PROJECT_ID.region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
  )
SELECT
  billing_date,
  sum(total_tib_billed * multiplier) estimated_charge,
  sum(total_tib_billed) estimated_usage_in_tib,
  countif(isMaybeUsingRowLevelSecurity(job_type, total_tib_billed, error_result))
    AS jobs_using_row_level_security,
FROM usage_with_multiplier, query_params
WHERE
  1 = 1
  -- Filter by creation_time for partition pruning.
  AND date(creation_time) BETWEEN date_sub(start_date, INTERVAL 2 day) AND end_date
  AND billing_date BETWEEN start_date AND end_date
  AND isBillable(error_result)
GROUP BY billing_date
ORDER BY billing_date

Batasan

  • BigQuery menyembunyikan beberapa statistik untuk kueri pada tabel dengan keamanan tingkat baris. Kueri yang diberikan menghitung jumlah tugas yang terpengaruh sebagai jobs_using_row_level_security, tetapi tidak memiliki akses ke penggunaan yang dapat ditagih.

  • Harga BigQuery ML untuk kueri sesuai permintaan bergantung pada jenis model yang dibuat. INFORMATION_SCHEMA.JOBS tidak melacak jenis model yang dibuat, sehingga kueri yang diberikan mengasumsikan semua pernyataan CREATE_MODEL membuat jenis model yang ditagih lebih tinggi.

  • Prosedur Apache Spark menggunakan model harga yang serupa, tetapi biaya dilaporkan sebagai SKU bayar sesuai penggunaan edisi BigQuery Enterprise. INFORMATION_SCHEMA.JOBS melacak penggunaan ini sebagai total_bytes_billed, tetapi tidak dapat menentukan SKU mana yang diwakili oleh penggunaan.

Menghitung penggunaan slot rata-rata

Contoh berikut menghitung penggunaan slot rata-rata untuk semua kueri selama 7 hari terakhir untuk project tertentu. Perlu diperhatikan bahwa penghitungan ini paling akurat untuk project yang memiliki penggunaan slot yang konsisten sepanjang minggu. Jika project Anda tidak memiliki penggunaan slot yang konsisten, jumlah ini mungkin lebih rendah dari yang diperkirakan.

Untuk menjalankan kueri:

SELECT
  SUM(total_slot_ms) / (1000 * 60 * 60 * 24 * 7) AS avg_slots
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS
WHERE
  -- Filter by the partition column first to limit the amount of data scanned.
  -- Eight days allows for jobs created before the 7 day end_time filter.
  creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND CURRENT_TIMESTAMP()
  AND job_type = 'QUERY'
  AND statement_type != 'SCRIPT'
  AND end_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) AND CURRENT_TIMESTAMP();

Hasilnya akan mirip dengan berikut ini:

+------------+
| avg_slots  |
+------------+
| 3879.1534  |
+------------+

Anda dapat memeriksa penggunaan untuk reservasi tertentu dengan WHERE reservation_id = "…". Hal ini dapat membantu untuk menentukan persentase penggunaan reservasi selama jangka waktu tertentu. Untuk tugas skrip, tugas induk juga melaporkan total penggunaan slot dari tugas turunannya. Untuk menghindari penghitungan ganda, gunakan WHERE statement_type != "SCRIPT" untuk mengecualikan tugas induk.

Jika Anda ingin memeriksa penggunaan slot rata-rata untuk setiap tugas, gunakan total_slot_ms / TIMESTAMP_DIFF(end_time, start_time, MILLISECOND).

Muat histori tugas

Contoh berikut mencantumkan semua pengguna atau akun layanan yang mengirimkan tugas pemuatan batch untuk project tertentu. Karena tidak ada batas waktu yang ditentukan, kueri ini akan memindai semua histori yang tersedia (misalnya, 30 hari terakhir).

SELECT
  DISTINCT(user_email) AS user
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS
WHERE
  job_type = 'LOAD';

Hasilnya akan mirip dengan berikut ini:

+--------------+
| user         |
+--------------+
| abc@xyz.com  |
+--------------+
| def@xyz.com  |
+--------------+

Mendapatkan jumlah tugas pemuatan untuk menentukan kuota tugas harian yang digunakan

Contoh berikut menampilkan jumlah tugas menurut hari, set data, dan tabel, sehingga Anda dapat menentukan berapa banyak kuota tugas harian yang digunakan.

SELECT
    DATE(creation_time) as day,
    destination_table.project_id as project_id,
    destination_table.dataset_id as dataset_id,
    destination_table.table_id as table_id,
    COUNT(job_id) AS load_job_count
 FROM
   region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT
 WHERE
    creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND CURRENT_TIMESTAMP()
    AND job_type = "LOAD"
GROUP BY
    day,
    project_id,
    dataset_id,
    table_id
ORDER BY
    day DESC

Mendapatkan 10 tugas yang gagal terakhir

Contoh berikut menunjukkan 10 tugas terakhir yang gagal:

SELECT
   job_id,
  creation_time,
  user_email,
   error_result
 FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
 WHERE error_result.reason != "Null"
ORDER BY creation_time DESC
LIMIT 10

Hasilnya akan terlihat seperti berikut:

+---------------+--------------------------+------------------+-----------------------------------------------------------+
| job_id        | creation_time            | user_email       | error_result                                              |
+---------------+--------------------------+------------------+-----------------------------------------------------------+
| examplejob_1  | 2020-10-10 00:00:00 UTC  | bob@example.com  | Column 'generate_metadata_snapshot' has mismatched type...|
| examplejob_2  | 2020-10-11 00:00:00 UTC  | bob@example.com  | Column 'generate_metadata_snapshot' has mismatched type...|
+---------------+--------------------------+------------------+-----------------------------------------------------------+

Membuat kueri daftar tugas yang berjalan lama

Contoh berikut menampilkan daftar tugas yang berjalan lama yang berada dalam status RUNNING atau PENDING selama lebih dari 30 menit:

SELECT
  job_id,
  job_type,
  state,
  creation_time,
  start_time,
  user_email
 FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
 WHERE
    state!="DONE" AND
    creation_time <= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 MINUTE)
ORDER BY creation_time ASC;

Hasilnya akan mirip dengan berikut ini:

+---------------+----------+---------+--------------------------------+--------------------------------+------------------+
| job_id        | job_type | state   | creation_time                  | start_time                     | user_email       |
+---------------+----------+---------+--------------------------------+--------------------------------+------------------+
| examplejob_1  | QUERY    | RUNNING | 2023-05-03 05:07:22.818000 UTC | 2023-05-03 05:07:22.905000 UTC | abc@example.com  |
| examplejob_2  | QUERY    | PENDING | 2023-05-01 02:05:47.925000 UTC | 2023-05-01 02:05:47.998000 UTC | xyz@example.com  |
+---------------+----------+---------+--------------------------------+--------------------------------+------------------+

Byte yang diproses per identitas pengguna

Contoh berikut menunjukkan total byte yang ditagih untuk tugas kueri per pengguna:

SELECT
  user_email,
  SUM(total_bytes_billed) AS bytes_billed
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS
WHERE
  job_type = 'QUERY'
  AND statement_type != 'SCRIPT'
GROUP BY
  user_email;

Catatan: Lihat peringatan untuk kolom total_bytes_billed dalam dokumentasi skema untuk tampilan JOBS.

Hasilnya akan terlihat seperti berikut:

+---------------------+--------------+
| user_email          | bytes_billed |
+---------------------+--------------+
| bob@example.com     | 2847932416   |
| alice@example.com   | 1184890880   |
| charles@example.com | 10485760     |
+---------------------+--------------+

Perincian byte yang diproses per jam

Contoh berikut menampilkan total byte yang ditagih untuk tugas kueri, dalam interval per jam:

SELECT
  TIMESTAMP_TRUNC(end_time, HOUR) AS time_window,
  SUM(total_bytes_billed) AS bytes_billed
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS
WHERE
  job_type = 'QUERY'
  AND statement_type != 'SCRIPT'
GROUP BY
  time_window
ORDER BY
  time_window DESC;

Hasilnya akan mirip dengan berikut ini:

+-------------------------+--------------+
| time_window             | bytes_billed |
+-------------------------+--------------+
| 2022-05-17 20:00:00 UTC | 1967128576   |
| 2022-05-10 21:00:00 UTC | 0            |
| 2022-04-15 20:00:00 UTC | 10485760     |
| 2022-04-15 17:00:00 UTC | 41943040     |
+-------------------------+--------------+

Tugas kueri per tabel

Contoh berikut menunjukkan berapa kali setiap tabel yang dikueri dalam my_project direferensikan oleh tugas kueri:

SELECT
  t.project_id,
  t.dataset_id,
  t.table_id,
  COUNT(*) AS num_references
FROM
  my_project.`region-us`.INFORMATION_SCHEMA.JOBS, UNNEST(referenced_tables) AS t
GROUP BY
  t.project_id,
  t.dataset_id,
  t.table_id
ORDER BY
  num_references DESC;

Hasilnya akan mirip dengan berikut ini:

+------------+------------+----------+----------------+
| project_id | dataset_id | table_id | num_references |
+------------+------------+----------+----------------+
| my_project | dataset1   | orders   | 58             |
| my_project | dataset1   | products | 40             |
| my_project | dataset2   | sales    | 30             |
| other_proj | dataset1   | accounts | 12             |
+------------+------------+----------+----------------+

Jumlah partisi yang diubah berdasarkan tugas kueri dan pemuatan per tabel

Contoh berikut menunjukkan jumlah partisi yang dimodifikasi oleh kueri dengan pernyataan DML dan tugas pemuatan, per tabel. Perhatikan bahwa kueri ini tidak menampilkan total_modified_partitions untuk tugas penyalinan.

SELECT
  destination_table.table_id,
  SUM(total_modified_partitions) AS total_modified_partitions
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS
WHERE
  DATE(creation_time, "America/Los_Angeles") = CURRENT_DATE()
GROUP BY
  table_id
ORDER BY
  total_modified_partitions DESC

Kueri paling mahal berdasarkan project

Contoh berikut mencantumkan kueri paling mahal di my_project menurut waktu penggunaan slot:

SELECT
 job_id,
 query,
 user_email,
 total_slot_ms
FROM `my_project`.`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE EXTRACT(DATE FROM  creation_time) = current_date()
ORDER BY total_slot_ms DESC
LIMIT 4

Anda juga dapat mencantumkan kueri paling mahal berdasarkan data yang diproses dengan contoh berikut:

SELECT
 job_id,
 query,
 user_email,
 total_bytes_processed
FROM `my_project`.`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE EXTRACT(DATE FROM  creation_time) = current_date()
ORDER BY total_bytes_processed DESC
LIMIT 4

Hasil untuk kedua contoh tersebut mirip dengan yang berikut:

+--------------+---------------------------------+-----------------------+---------------+
| job_id       | query                           | user_email            | total_slot_ms |
+--------------+---------------------------------+--------------------------+------------+
| examplejob_1 | SELECT ... FROM dataset.table1  | bob@example.com       | 80,000        |
| examplejob_2 | SELECT ... FROM dataset.table2  | alice@example.com     | 78,000        |
| examplejob_3 | SELECT ... FROM dataset.table3  | charles@example.com   | 75,000        |
| examplejob_4 | SELECT ... FROM dataset.table4  | tina@example.com      | 72,000        |
+--------------+---------------------------------+-----------------------+---------------+

Mendapatkan detail tentang peringatan resource

Jika menerima pesan error Resource terlampaui, Anda dapat menanyakan tentang kueri dalam jangka waktu tertentu:

SELECT
  query,
  query_info.resource_warning
FROM
  `user_project.region-us`.INFORMATION_SCHEMA.JOBS
WHERE
 creation_time BETWEEN TIMESTAMP("2022-12-01")
 AND TIMESTAMP("2022-12-08")
 AND query_info.resource_warning IS NOT NULL
LIMIT
 50;

Memantau peringatan resource yang dikelompokkan berdasarkan tanggal

Jika mendapatkan pesan error Resource exceeded, Anda dapat memantau jumlah total peringatan resource yang dikelompokkan berdasarkan tanggal untuk mengetahui apakah ada perubahan pada workload:

WITH resource_warnings AS (
  SELECT
    EXTRACT(DATE FROM creation_time) AS creation_date
  FROM
    `user_project.region-us`.INFORMATION_SCHEMA.JOBS
  WHERE
    creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 14 DAY)
    AND query_info.resource_warning IS NOT NULL
)
SELECT
  creation_date,
  COUNT(1) AS warning_counts
FROM
  resource_warnings
GROUP BY creation_date
ORDER BY creation_date DESC;

Memperkirakan penggunaan slot dan biaya untuk kueri

Contoh berikut menghitung slot rata-rata dan slot maksimum untuk setiap tugas menggunakan estimated_runnable_units.

Harga reservation_id adalah NULL jika Anda tidak memiliki reservasi.

SELECT
  project_id,
  job_id,
  reservation_id,
  EXTRACT(DATE FROM creation_time) AS creation_date,
  TIMESTAMP_DIFF(end_time, start_time, SECOND) AS job_duration_seconds,
  job_type,
  user_email,
  total_bytes_billed,

  -- Average slot utilization per job is calculated by dividing total_slot_ms by the millisecond duration of the job

  SAFE_DIVIDE(job.total_slot_ms,(TIMESTAMP_DIFF(job.end_time, job.start_time, MILLISECOND))) AS job_avg_slots,
  query,

  -- Determine the max number of slots used at ANY stage in the query.
  -- The average slots might be 55. But a single stage might spike to 2000 slots.
  -- This is important to know when estimating number of slots to purchase.

  MAX(SAFE_DIVIDE(unnest_job_stages.slot_ms,unnest_job_stages.end_ms - unnest_job_stages.start_ms)) AS jobstage_max_slots,

  -- Check if there's a job that requests more units of works (slots). If so you need more slots.
  -- estimated_runnable_units = Units of work that can be scheduled immediately.
  -- Providing additional slots for these units of work accelerates the query,
  -- if no other query in the reservation needs additional slots.

  MAX(unnest_timeline.estimated_runnable_units) AS estimated_runnable_units
FROM `region-us`.INFORMATION_SCHEMA.JOBS AS job
  CROSS JOIN UNNEST(job_stages) as unnest_job_stages
  CROSS JOIN UNNEST(timeline) AS unnest_timeline
WHERE project_id = 'my_project'
  AND statement_type != 'SCRIPT'
  AND DATE(creation_time) BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND CURRENT_DATE()
GROUP BY 1,2,3,4,5,6,7,8,9,10
ORDER BY job_id;

Melihat insight performa untuk kueri

Contoh berikut menampilkan semua tugas kueri yang memiliki insight performa dari project Anda dalam 30 hari terakhir, beserta URL yang tertaut ke grafik eksekusi kueri di Konsol Google Cloud.

SELECT
  `bigquery-public-data`.persistent_udfs.job_url(
    project_id || ':us.' || job_id) AS job_url,
  query_info.performance_insights
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  DATE(creation_time) >= CURRENT_DATE - 30 -- scan 30 days of query history
  AND job_type = 'QUERY'
  AND state = 'DONE'
  AND error_result IS NULL
  AND statement_type != 'SCRIPT'
  AND EXISTS ( -- Only include queries which had performance insights
    SELECT 1
    FROM UNNEST(
      query_info.performance_insights.stage_performance_standalone_insights
    )
    WHERE slot_contention OR insufficient_shuffle_quota
    UNION ALL
    SELECT 1
    FROM UNNEST(
      query_info.performance_insights.stage_performance_change_insights
    )
    WHERE input_data_change.records_read_diff_percentage IS NOT NULL
  );

Melihat tugas pembaruan metadata

Contoh berikut mencantumkan tugas pembaruan metadata:

SELECT
 *
FROM
 `region-aws-us-east-1.INFORMATION_SCHEMA.JOBS_BY_PROJECT`
WHERE
 job_id LIKE '%metadata_cache_refresh%'
 AND creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
ORDER BY start_time desc
LIMIT 10;

Menganalisis performa dari waktu ke waktu untuk kueri yang identik

Contoh berikut menampilkan 10 tugas paling lambat selama 7 hari terakhir yang menjalankan kueri yang sama:

DECLARE querytext STRING DEFAULT(
  SELECT query
  FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
  WHERE job_id = 'JOB_ID'
  LIMIT 1
);

SELECT
  start_time,
  end_time,
  project_id,
  job_id,
  TIMESTAMP_DIFF(end_time, start_time, SECOND) AS run_secs,
  total_bytes_processed / POW(1024, 3) AS total_gigabytes_processed,
  query
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  query = querytext
  AND total_bytes_processed > 0
  AND creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY 5 DESC
LIMIT 10;

Ganti JOB_ID dengan job_id apa pun yang menjalankan kueri yang Anda analisis.