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 diperlukan untuk 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 ke project, folder, dan organisasi.
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. |
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_creation_reason.code |
STRING |
Menentukan alasan tingkat tinggi mengapa tugas dibuat. Nilai yang mungkin adalah:
|
job_id |
STRING |
ID tugas jika tugas dibuat. Jika tidak, ID kueri dari kueri yang menggunakan mode kueri
singkat. 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 hit cache. |
reservation_id |
STRING |
Nama reservasi utama yang ditetapkan untuk tugas ini,
dalam format
RESERVATION_ADMIN_PROJECT:RESERVATION_LOCATION.RESERVATION_NAME .Dalam output ini:
|
edition |
STRING |
Edisi yang terkait dengan reservasi yang ditetapkan ke tugas ini. Untuk mengetahui informasi selengkapnya tentang edisi, lihat Pengantar edisi BigQuery. |
session_info |
RECORD |
Detail tentang sesi tempat tugas ini dijalankan, jika ada. |
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.
Nilai hash akan berbeda saat tampilan yang mendasarinya berubah, atau jika kueri secara implisit
mereferensikan kolom, seperti SELECT * , dan skema tabel berubah.
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 kueriINFORMATION_SCHEMA.JOBS
untuk menemukan biaya ringkasan tugas kueri, Anda harus mengecualikan jenis pernyataanSCRIPT
. Jika tidak, beberapa nilai sepertitotal_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 |
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
PROJECT_ID
: ID project.REGION_NAME
: region untuk project Anda.
Misalnya, `myproject`.`region-us-central1`.INFORMATION_SCHEMA.JOBS
.
Membandingkan penggunaan tugas on demand dengan data penagihan
Untuk project yang menggunakan harga on-demand,
Anda dapat menggunakan tampilan INFORMATION_SCHEMA.JOBS
untuk meninjau
biaya komputasi selama jangka waktu tertentu.
Untuk project yang menggunakan harga berbasis kapasitas (slot), Anda dapat menggunakan INFORMATION_SCHEMA.RESERVATIONS_TIMELINE
untuk meninjau tagihan komputasi selama jangka waktu tertentu.
Kueri berikut menghasilkan estimasi agregat harian TiB yang ditagih dan tagihan yang dihasilkan. Bagian batasan menjelaskan kapan estimasi ini mungkin tidak cocok dengan tagihan Anda.
Khusus untuk contoh ini, variabel tambahan berikut harus ditetapkan. Anda dapat mengeditnya di sini agar mudah digunakan.
START_DATE
: tanggal paling awal untuk digabungkan (inklusif).END_DATE
: tanggal terbaru 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 `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS ) 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 tagihan dilaporkan sebagai SKU bayar sesuai penggunaan edisi BigQuery Enterprise.
INFORMATION_SCHEMA.JOBS
melacak penggunaan ini sebagaitotal_bytes_billed
, tetapi tidak dapat menentukan SKU mana yang diwakili oleh penggunaan tersebut.
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-REGION_NAME`.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 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)
.
Menghitung kueri aktif terbaru berdasarkan prioritas kueri
Contoh berikut menampilkan jumlah kueri, yang dikelompokkan berdasarkan prioritas (interaktif atau batch) yang dimulai dalam 7 jam terakhir:
SELECT priority, COUNT(*) active_jobs FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 hour) AND job_type = 'QUERY' GROUP BY priority;
Hasilnya mirip dengan berikut ini:
+-------------+-------------+ | priority | active_jobs | +-------------+-------------+ | INTERACTIVE | 2 | | BATCH | 3 | +-------------+-------------+
Kolom priority
menunjukkan apakah kueri adalah INTERACTIVE
atau BATCH
.
Melihat histori tugas pemuatan
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.
SELECT user_email AS user, COUNT(*) num_jobs FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS WHERE job_type = 'LOAD' GROUP BY user_email;
Hasilnya 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-REGION_NAME`.INFORMATION_SCHEMA.JOBS 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-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY 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 'col1' has mismatched type...| | examplejob_2 | 2020-10-11 00:00:00 UTC | bob@example.com | Column 'col1' 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-REGION_NAME`.INFORMATION_SCHEMA.JOBS WHERE state!="DONE" AND creation_time <= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 MINUTE) ORDER BY creation_time ASC;
Hasilnya mirip dengan berikut ini:
+--------+----------+---------+--------------------------------+--------------------------------+------------------+ | job_id | job_type | state | creation_time | start_time | user_email | +--------+----------+---------+--------------------------------+--------------------------------+------------------+ | job_1 | QUERY | RUNNING | 2023-05-03 05:07:22.818000 UTC | 2023-05-03 05:07:22.905000 UTC | abc@example.com | | job_2 | QUERY | PENDING | 2023-05-01 02:05:47.925000 UTC | 2023-05-01 02:05:47.998000 UTC | xyz@example.com | +--------+----------+---------+--------------------------------+--------------------------------+------------------+
Kueri yang menggunakan mode pengoptimalan kueri singkat
Contoh berikut menunjukkan daftar kueri yang dieksekusi dalam mode kueri singkat yang dioptimalkan, yang tidak dibuat oleh BigQuery.
SELECT job_id, FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS WHERE TIMESTAMP_TRUNC(creation_time, DAY) = '2024-06-12' AND job_creation_reason.code IS NULL LIMIT 10;
Hasilnya akan terlihat seperti berikut:
+------------------------------------------+ | job_id | +------------------------------------------+ | 2Lm09bHxDEsoVK8zwzWJomLHU_Ud%1910479b151 | | j9_GVQf28jW2M1_RfTYGRPX1vq--!191047a135f | +------------------------------------------+
Contoh berikut menunjukkan informasi tentang kueri yang dijalankan dalam mode kueri singkat yang dioptimalkan, yang tidak dibuat oleh BigQuery.
SELECT job_id, statement_type, priority, cache_hit, job_creation_reason.code AS job_creation_reason_code, total_bytes_billed, total_bytes_processed, total_slot_ms, state, error_result.message AS error_result_message, FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS WHERE TIMESTAMP_TRUNC(creation_time, DAY) = '2024-06-12' AND job_id = '2Lm09bHxDEsoVK8zwzWJomLHU_Ud%1910479b151' -- queryId
Catatan: Kolom job_id
berisi queryId
kueri saat tugas tidak
dibuat untuk kueri ini.
Hasilnya akan terlihat seperti berikut:
+------------------------------------------+----------------+-------------+-----------+--------------------------+--------------------+-----------------------+---------------+-------+----------------------+ | job_id | statement_type | priority | cache_hit | job_creation_reason_code | total_bytes_billed | total_bytes_processed | total_slot_ms | state | error_result_message | +------------------------------------------+----------------+-------------+-----------+--------------------------+--------------------+-----------------------+---------------+-------+----------------------+ | 2Lm09bHxDEsoVK8zwzWJomLHU_Ud%1910479b151 | SELECT | INTERACTIVE | false | null | 161480704 | 161164718 | 3106 | DONE | null | +------------------------------------------+----------------+-------------+-----------+--------------------------+--------------------+-----------------------+---------------+-------+----------------------+
Contoh berikut menunjukkan daftar kueri yang dieksekusi dalam mode kueri singkat yang dioptimalkan, yang membuat BigQuery membuat tugas.
SELECT job_id, job_creation_reason.code AS job_creation_reason_code FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS WHERE TIMESTAMP_TRUNC(creation_time, DAY) = '2024-06-12' AND job_creation_reason.code IS NOT NULL AND job_creation_reason.code != 'REQUESTED' LIMIT 10
Hasilnya akan terlihat seperti berikut:
+----------------------------------+--------------------------+ | job_id | job_creation_reason_code | +----------------------------------+--------------------------+ | job_LxOEwrJEffcOfjK7GBwWjO3RroOI | LARGE_RESULTS | +----------------------------------+--------------------------+
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-REGION_NAME`.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-REGION_NAME`.INFORMATION_SCHEMA.JOBS WHERE job_type = 'QUERY' AND statement_type != 'SCRIPT' GROUP BY time_window ORDER BY time_window DESC;
Hasilnya 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 `region-REGION_NAME`.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 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 oleh tugas kueri dan pemuatan per tabel
Contoh berikut menunjukkan jumlah partisi yang diubah 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-REGION_NAME`.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-REGION_NAME`.INFORMATION_SCHEMA.JOBS 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-REGION_NAME`.INFORMATION_SCHEMA.JOBS 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 `region-REGION_NAME`.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 `region-REGION_NAME`.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-REGION_NAME`.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-REGION_NAME`.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-REGION_NAME`.INFORMATION_SCHEMA.JOBS 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-REGION_NAME`.INFORMATION_SCHEMA.JOBS 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.
Mencocokkan perilaku penggunaan slot dari diagram resource administratif
Untuk mempelajari perilaku penggunaan slot yang mirip dengan informasi dalam diagram resource
administratif, buat kueri
tampilan INFORMATION_SCHEMA.JOBS_TIMELINE
.