JOBS ๋ทฐ

INFORMATION_SCHEMA.JOBS ๋ทฐ์—๋Š” ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  BigQuery ์ž‘์—…์— ๋Œ€ํ•œ ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์—ญํ• 

INFORMATION_SCHEMA.JOBS ๋ทฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ BigQuery ๋ฆฌ์†Œ์Šค ๋ทฐ์–ด (roles/bigquery.resourceViewer) IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”. ์—ญํ•  ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์—๋Š” INFORMATION_SCHEMA.JOBS ๋ทฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ bigquery.jobs.listAll ๊ถŒํ•œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์—ญํ• ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

BigQuery ๊ถŒํ•œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM์œผ๋กœ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์Šคํ‚ค๋งˆ

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋Š” creation_time ์—ด๋กœ ํŒŒํ‹ฐ์…˜์„ ๋‚˜๋ˆ„๊ณ  project_id ๋ฐ user_email๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ง๋ฉ๋‹ˆ๋‹ค. query_info ์—ด์—๋Š” ์ฟผ๋ฆฌ ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

INFORMATION_SCHEMA.JOBS ๋ทฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํ‚ค๋งˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด ์ด๋ฆ„ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๊ฐ’
bi_engine_statistics RECORD ํ”„๋กœ์ ํŠธ๊ฐ€ BI Engine์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์ด ํ•„๋“œ์—๋Š” BiEngineStatistics๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” NULL์ž…๋‹ˆ๋‹ค.
cache_hit BOOLEAN ์ด ์ž‘์—…์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์บ์‹œ์—์„œ ์ œ๊ณต๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€ ๋ฉ€ํ‹ฐ ์ฟผ๋ฆฌ ๋ฌธ ์ž‘์—…์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒ์œ„ ์ฟผ๋ฆฌ์˜ cache_hit๋Š” NULL์ž…๋‹ˆ๋‹ค.
creation_time TIMESTAMP (ํŒŒํ‹ฐ์…˜ ๋‚˜๋ˆ„๊ธฐ ์—ด) ์ด ์ž‘์—…์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ํŒŒํ‹ฐ์…˜ ๋‚˜๋ˆ„๊ธฐ๋Š” ์ด ํƒ€์ž„์Šคํƒฌํ”„์˜ UTC ์‹œ๊ฐ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
destination_table RECORD ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค(ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ).
end_time TIMESTAMP ์ž‘์—…์˜ ์ข…๋ฃŒ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค(์—ํฌํฌ ์ดํ›„์˜ ๊ฒฝ๊ณผ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)). ์ด ํ•„๋“œ๋Š” ์ž‘์—…์ด DONE ์ƒํƒœ๊ฐ€ ๋˜๋Š” ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
error_result RECORD ErrorProto ๊ฐ์ฒด๋กœ์„œ์˜ ์˜ค๋ฅ˜ ์„ธ๋ถ€์ •๋ณด์ž…๋‹ˆ๋‹ค.
job_creation_reason.code STRING ์ž‘์—…์ด ์ƒ์„ฑ๋œ ๋Œ€๋žต์ ์ธ ์ด์œ ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • REQUESTED: ์ž‘์—… ์ƒ์„ฑ์ด ์š”์ฒญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • LONG_RUNNING: ์ฟผ๋ฆฌ ์š”์ฒญ์ด QueryRequest์˜ timeoutMs ํ•„๋“œ๋กœ ์ง€์ •๋œ ์‹œ์Šคํ…œ ์ •์˜ ์ œํ•œ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜์—ฌ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์—…์ด ์ƒ์„ฑ๋œ ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์œผ๋กœ ๊ฐ„์ฃผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • LARGE_RESULTS: ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ธ๋ผ์ธ ์‘๋‹ต์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • OTHER: ์‹œ์Šคํ…œ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
job_id STRING ์ž‘์—…์ด ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ์ž‘์—…์˜ ID์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ ํƒ์  ์ž‘์—… ์ƒ์„ฑ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ์ฟผ๋ฆฌ ID์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด bquxjob_1234์ž…๋‹ˆ๋‹ค.
job_stages RECORD ์ž‘์—…์˜ ์ฟผ๋ฆฌ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ํ–‰ ์ˆ˜์ค€ ์•ก์„ธ์Šค ์ •์ฑ…์ด ์ ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ์ฝ๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ด ์—ด์˜ ๊ฐ’์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ BigQuery์˜ ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

job_type STRING ์ž‘์—…์˜ ์œ ํ˜•. QUERY, LOAD, EXTRACT, COPY, NULL์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NULL ๊ฐ’์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
labels RECORD ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ž‘์—…์— ์ ์šฉ๋œ ๋ผ๋ฒจ์˜ ๋ฐฐ์—ด
parent_job_id STRING ์ƒ์œ„ ์ž‘์—…์˜ ID(์žˆ๋Š” ๊ฒฝ์šฐ)
priority STRING ์ด ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„. ์œ ํšจํ•œ ๊ฐ’์€ INTERACTIVE ๋ฐ BATCH์ž…๋‹ˆ๋‹ค.
project_id STRING (ํด๋Ÿฌ์Šคํ„ฐ๋ง ์—ด) ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.
project_number INTEGER ํ”„๋กœ์ ํŠธ์˜ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
query STRING SQL ์ฟผ๋ฆฌ ํ…์ŠคํŠธ. JOBS_BY_PROJECT ๋ทฐ์—๋งŒ ์ฟผ๋ฆฌ ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.
referenced_tables RECORD ์ž‘์—…์—์„œ ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ ์ค‘์ด ์•„๋‹Œ ์ฟผ๋ฆฌ ์ž‘์—…๋งŒ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.
reservation_id STRING ์ด ์ž‘์—…์— ํ• ๋‹น๋œ ๊ธฐ๋ณธ ์˜ˆ์•ฝ์˜ ์ด๋ฆ„์ด๋ฉฐ RESERVATION_ADMIN_PROJECT:RESERVATION_LOCATION.RESERVATION_NAME ํ˜•์‹์ž…๋‹ˆ๋‹ค.
์ด ์ถœ๋ ฅ์—์„œ ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • RESERVATION_ADMIN_PROJECT: ์˜ˆ์•ฝ์„ ๊ด€๋ฆฌํ•˜๋Š” Google Cloud ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • RESERVATION_LOCATION: ์˜ˆ์•ฝ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  • RESERVATION_NAME: ์˜ˆ์•ฝ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
edition STRING ์ด ์ž‘์—…์— ํ• ๋‹น๋œ ์˜ˆ์•ฝ๊ณผ ์—ฐ๊ฒฐ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ๋ฒ„์ „์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ BigQuery ๋ฒ„์ „ ์†Œ๊ฐœ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
session_info RECORD ์ด ์ž‘์—…์ด ์‹คํ–‰๋œ ์„ธ์…˜์— ๋Œ€ํ•œ ์„ธ๋ถ€์ •๋ณด์ž…๋‹ˆ๋‹ค(์žˆ๋Š” ๊ฒฝ์šฐ).
start_time TIMESTAMP ์ž‘์—…์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค(์—ํฌํฌ ์ดํ›„์˜ ๊ฒฝ๊ณผ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)). ์ด ํ•„๋“œ๋Š” ์ž‘์—…์ด PENDING ์ƒํƒœ์—์„œ RUNNING ๋˜๋Š” DONE ์ƒํƒœ๊ฐ€ ๋˜๋Š” ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
state STRING ์ž‘์—…์˜ ์‹คํ–‰ ์ƒํƒœ. ์œ ํšจํ•œ ์ƒํƒœ์—๋Š” PENDING, RUNNING, DONE์ด ์žˆ์Šต๋‹ˆ๋‹ค.
statement_type STRING ์ฟผ๋ฆฌ ๋ฌธ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด DELETE, INSERT, SCRIPT, SELECT, UPDATE์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•œ ๊ฐ’ ๋ชฉ๋ก์€ QueryStatementType์„ ์ฐธ์กฐํ•˜์„ธ์š”.
timeline RECORD ์ž‘์—…์˜ ์ฟผ๋ฆฌ ํƒ€์ž„๋ผ์ธ์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์‹คํ–‰ ์Šค๋ƒ…์ƒท์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
total_bytes_billed INTEGER ํ”„๋กœ์ ํŠธ๊ฐ€ ์ฃผ๋ฌธํ˜• ๊ฐ€๊ฒฉ ์ฑ…์ •์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์ด ํ•„๋“œ์—๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์ฒญ๊ตฌ๋˜๋Š” ์ด ๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ์ •์•ก์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ๋ฐ”์ดํŠธ ์š”๊ธˆ์ด ์ฒญ๊ตฌ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด ํ•„๋“œ๋Š” ์ฐธ๊ณ ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ํ–‰ ์ˆ˜์ค€ ์•ก์„ธ์Šค ์ •์ฑ…์ด ์ ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ์ฝ๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ด ์—ด์˜ ๊ฐ’์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ BigQuery์˜ ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

total_bytes_processed INTEGER

์ž‘์—…์—์„œ ์ฒ˜๋ฆฌํ•œ ์ด ๋ฐ”์ดํŠธ

์ฐธ๊ณ : ํ–‰ ์ˆ˜์ค€ ์•ก์„ธ์Šค ์ •์ฑ…์ด ์ ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ์ฝ๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ด ์—ด์˜ ๊ฐ’์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ BigQuery์˜ ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

total_modified_partitions INTEGER ์ž‘์—…์—์„œ ์ˆ˜์ •ํ•œ ์ด ํŒŒํ‹ฐ์…˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” LOAD ๋ฐ QUERY ์ž‘์—…์— ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.
total_slot_ms INTEGER ์žฌ์‹œ๋„๋ฅผ ํฌํ•จํ•˜์—ฌ RUNNING ์ƒํƒœ์˜ ์ „์ฒด ๊ธฐ๊ฐ„ ๋™์•ˆ ์ž‘์—…์˜ ์Šฌ๋กฏ ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค.
transaction_id STRING ์ด ์ž‘์—…์ด ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜์˜ ID์ž…๋‹ˆ๋‹ค(์žˆ๋Š” ๊ฒฝ์šฐ). (๋ฏธ๋ฆฌ๋ณด๊ธฐ)
user_email STRING (ํด๋Ÿฌ์Šคํ„ฐ๋ง ์—ด) ์ž‘์—…์„ ์‹คํ–‰ํ•œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์ž…๋‹ˆ๋‹ค.
query_info.resource_warning STRING ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์ค‘ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์ด ์‹œ์Šคํ…œ์˜ ๋‚ด๋ถ€ ๊ธฐ์ค€์ ์„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.
์„ฑ๊ณต์ ์ธ ์ฟผ๋ฆฌ ์ž‘์—…์—๋Š” resource_warning ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. resource_warning์˜ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  query_hashes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ฟผ๋ฆฌ ์ง‘ํ•ฉ์˜ ์„ฑ๋Šฅ ์ถ”์„ธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
query_info.query_hashes.normalized_literals STRING ์ฟผ๋ฆฌ์˜ ํ•ด์‹œ ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. normalized_literals๋Š” ์ฃผ์„, ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’, UDF, ๋ฆฌํ„ฐ๋Ÿด์„ ๋ฌด์‹œํ•˜๋Š” 16์ง„์ˆ˜ STRING ํ•ด์‹œ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ทฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๊ฐ€ SELECT *์™€ ๊ฐ™์€ ์—ด์„ ์•”์‹œ์ ์œผ๋กœ ์ฐธ์กฐํ•˜๊ณ  ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด์‹œ ๊ฐ’์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
์ด ํ•„๋“œ๋Š” ์บ์‹œ ์ ์ค‘์ด ์•„๋‹Œ ์„ฑ๊ณตํ•œ GoogleSQL ์ฟผ๋ฆฌ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
query_info.performance_insights RECORD ์ž‘์—…์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ํ†ต๊ณ„.
query_info.optimization_details STRUCT ์ž‘์—…์˜ ๊ธฐ๋ก ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”.
transferred_bytes INTEGER BigQuery Omni ๊ต์ฐจ ํด๋ผ์šฐ๋“œ ์ „์†ก ์ž‘์—…๊ณผ ๊ฐ™์€ ๊ต์ฐจ ํด๋ผ์šฐ๋“œ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ „์†ก๋œ ์ด ๋ฐ”์ดํŠธ ์ˆ˜์ž…๋‹ˆ๋‹ค.
materialized_view_statistics RECORD ์ฟผ๋ฆฌ ์ž‘์—…์—์„œ ๊ณ ๋ ค๋˜๋Š” ๊ตฌ์ฒดํ™”๋œ ๋ทฐ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค. (๋ฏธ๋ฆฌ๋ณด๊ธฐ)
metadata_cache_statistics RECORD ์ฟผ๋ฆฌ ์ž‘์—…์—์„œ ์ฐธ์กฐ๋œ ํ…Œ์ด๋ธ”์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—ด ์ƒ‰์ธ ์‚ฌ์šฉ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค.
search_statistics RECORD ๊ฒ€์ƒ‰์–ด์˜ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค.
query_dialect STRING ์ด ํ•„๋“œ๋Š” 2025๋…„ 5์›”์— ์ œ๊ณต๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ž‘์—…์— ์‚ฌ์šฉ๋œ ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • GOOGLE_SQL: GoogleSQL์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ž‘์—…์ด ์š”์ฒญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • LEGACY_SQL: Job์—์„œ LegacySQL์„ ์‚ฌ์šฉํ•˜๋„๋ก ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.
  • DEFAULT_LEGACY_SQL: ์ž‘์—… ์š”์ฒญ์— ์ฟผ๋ฆฌ ์–ธ์–ด๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. BigQuery์—์„œ LegacySQL์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • DEFAULT_GOOGLE_SQL: ์ž‘์—… ์š”์ฒญ์— ์ฟผ๋ฆฌ ์–ธ์–ด๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. BigQuery์—์„œ GoogleSQL์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํ•„๋“œ๋Š” ์ฟผ๋ฆฌ ์ž‘์—…์—๋งŒ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์–ธ์–ด์˜ ๊ธฐ๋ณธ ์„ ํƒ์€ ๊ตฌ์„ฑ ์„ค์ •์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
continuous BOOLEAN ์ž‘์—…์ด ์—ฐ์† ์ฟผ๋ฆฌ์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.
continuous_query_info.output_watermark TIMESTAMP ์—ฐ์† ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ์‹œ์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
vector_search_statistics RECORD ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์˜ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์ž‘์—…์˜ ์š”์•ฝ ๋น„์šฉ์„ ์ฐพ๊ธฐ ์œ„ํ•ด INFORMATION_SCHEMA.JOBS๋ฅผ ์ฟผ๋ฆฌํ•  ๋•Œ๋Š” SCRIPT ๋ฌธ ์œ ํ˜•์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๋ถ€ ๊ฐ’์ด ๋‘ ๋ฒˆ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. SCRIPT ํ–‰์—๋Š” ์ด ์ž‘์—…์˜ ์ผ๋ถ€๋กœ ์‹คํ–‰๋œ ๋ชจ๋“  ํ•˜์œ„ ์ž‘์—…์˜ ์š”์•ฝ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ ์ž‘์—…

๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ ์ž‘์—…์€ ์ ˆ์ฐจ์  ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ ์ž‘์—…์€ DECLARE๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ IF ๋˜๋Š” WHILE๊ณผ ๊ฐ™์€ ํ๋ฆ„ ์ œ์–ด ๋ฌธ์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. INFORMATION_SCHEMA.JOBS๋ฅผ ์ฟผ๋ฆฌํ•  ๋•Œ๋Š” ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ ์ž‘์—…๊ณผ ๋‹ค๋ฅธ ์ž‘์—…์˜ ์ฐจ์ด๋ฅผ ์ธ์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ ์ž‘์—…์˜ ํŠน์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • statement_type = SCRIPT
  • reservation_id = NULL

ํ•˜์œ„ ์ž‘์—….

๊ฐ ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ ์ž‘์—…์˜ ํ•˜์œ„ ์ž‘์—…์—๋Š” ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ ์ž‘์—… ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” parent_job_id๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ด ์ž‘์—…์˜ ์ผ๋ถ€๋กœ ์‹คํ–‰๋œ ๋ชจ๋“  ํ•˜์œ„ ์ž‘์—…์— ๋Œ€ํ•œ ์š”์•ฝ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ฟผ๋ฆฌ ์ž‘์—…์˜ ์š”์•ฝ ๋น„์šฉ์„ ์ฐพ๊ธฐ ์œ„ํ•ด INFORMATION_SCHEMA.JOBS๋ฅผ ์ฟผ๋ฆฌํ•  ๋•Œ๋Š” SCRIPT ๋ฌธ ์œ ํ˜•์„ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด total_slot_ms์™€ ๊ฐ™์€ ์ผ๋ถ€ ๊ฐ’์€ ๋‘ ๋ฒˆ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณด๊ด€

์ด ๋ทฐ์—๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…๊ณผ ์ง€๋‚œ 180์ผ ๋™์•ˆ์˜ ์ž‘์—… ๊ธฐ๋ก์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ”์œ„ ๋ฐ ๊ตฌ๋ฌธ

์ด ๋ทฐ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ์—๋Š” ๋ฆฌ์ „ ํ•œ์ •์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ‘œ์—๋Š” ์ด ๋ทฐ์˜ ๋ฆฌ์ „ ๋ฒ”์œ„๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ทฐ ์ด๋ฆ„ ๋ฆฌ์†Œ์Šค ๋ฒ”์œ„ ๋ฆฌ์ „ ๋ฒ”์œ„
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS[_BY_PROJECT] ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ REGION
๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ์„ ํƒ์‚ฌํ•ญ: PROJECT_ID: Google Cloud ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • REGION: ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฆฌ์ „ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด `region-us`์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ

๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: ํ”„๋กœ์ ํŠธ ID
  • REGION_NAME: ํ”„๋กœ์ ํŠธ ๋ฆฌ์ „

์˜ˆ๋ฅผ ๋“ค๋ฉด `myproject`.`region-us-central1`.INFORMATION_SCHEMA.JOBS์ž…๋‹ˆ๋‹ค.

์ฃผ๋ฌธํ˜• ์ž‘์—… ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ ๋น„๊ต

์ฃผ๋ฌธํ˜• ๊ฐ€๊ฒฉ ์ฑ…์ •์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ INFORMATION_SCHEMA.JOBS ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ๊ธฐ๊ฐ„์˜ ์ปดํ“จํŒ… ์š”๊ธˆ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜(์Šฌ๋กฏ) ๊ฐ€๊ฒฉ ์ฑ…์ •์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ INFORMATION_SCHEMA.RESERVATIONS_TIMELINE์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ์ปดํ“จํŒ… ์š”๊ธˆ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ์ฒญ๊ตฌ๋œ TiB์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์š”๊ธˆ์˜ ์ผ์ผ ์˜ˆ์ƒ ์ง‘๊ณ„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ์‚ฌํ•ญ ์„น์…˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์˜ˆ์ƒ ๋น„์šฉ์ด ์ฒญ๊ตฌ์„œ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋‹ค์Œ ์ถ”๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • START_DATE: ์ง‘๊ณ„ํ•  ๊ฐ€์žฅ ๋น ๋ฅธ ๋‚ ์งœ์ž…๋‹ˆ๋‹ค(๋‹น์ผ ํฌํ•จ).
  • END_DATE: ์ง‘๊ณ„ํ•  ์ตœ์‹  ๋‚ ์งœ์ž…๋‹ˆ๋‹ค(๋‹น์ผ ํฌํ•จ).
  • PRICE_PER_TIB: ์˜ˆ์ƒ ์ฒญ๊ตฌ์•ก์— ์‚ฌ์šฉ๋˜๋Š” TiB๋‹น ์ฃผ๋ฌธํ˜• ๊ฐ€๊ฒฉ์ž…๋‹ˆ๋‹ค.
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;

์ œํ•œ์‚ฌํ•ญ

  • BigQuery๋Š” ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ์„ ๊ฐ–์ถ˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ์˜ ์ผ๋ถ€ ํ†ต๊ณ„๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ์ฟผ๋ฆฌ๋Š” ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ž‘์—… ์ˆ˜๋ฅผ jobs_using_row_level_security๋กœ ๊ณ„์‚ฐํ•˜์ง€๋งŒ ์ฒญ๊ตฌ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ๋Ÿ‰์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • BigQuery ML ์ฃผ๋ฌธํ˜• ์ฟผ๋ฆฌ ๊ฐ€๊ฒฉ ์ฑ…์ •์€ ์ƒ์„ฑ ์ค‘์ธ ๋ชจ๋ธ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. INFORMATION_SCHEMA.JOBS๋Š” ์ƒ์„ฑ๋œ ๋ชจ๋ธ ์œ ํ˜•์„ ์ถ”์ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ œ๊ณต๋œ ์ฟผ๋ฆฌ๋Š” ๋ชจ๋“  CREATE_MODEL ๋ฌธ์—์„œ ์ฒญ๊ตฌ ์š”๊ธˆ์ด ๋” ๋†’์€ ๋ชจ๋ธ ์œ ํ˜•์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • Apache Spark ์ ˆ์ฐจ์—๋Š” ์œ ์‚ฌํ•œ ๊ฐ€๊ฒฉ ์ฑ…์ • ๋ชจ๋ธ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ ์š”๊ธˆ์€ BigQuery Enterprise ๋ฒ„์ „ ์‚ฌ์šฉํ•œ ๋งŒํผ๋งŒ ์ง€๋ถˆํ•˜๋Š” SKU๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. INFORMATION_SCHEMA.JOBS๋Š” ์ด ์‚ฌ์šฉ๋Ÿ‰์„ total_bytes_billed๋กœ ์ถ”์ ํ•˜์ง€๋งŒ ์‚ฌ์šฉ๋Ÿ‰์ด ๋‚˜ํƒ€๋‚ด๋Š” SKU๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ‰๊ท  ์Šฌ๋กฏ ์‚ฌ์šฉ๋Ÿ‰ ๊ณ„์‚ฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์˜ ์ง€๋‚œ 7์ผ ๋™์•ˆ์˜ ๋ชจ๋“  ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ํ‰๊ท  ์Šฌ๋กฏ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„์‚ฐ์€ ์ผ์ฃผ์ผ ๋™์•ˆ ์ผ๊ด€๋œ ์Šฌ๋กฏ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ฐ€์ง„ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ์Šฌ๋กฏ ์‚ฌ์šฉ๋Ÿ‰์ด ์ผ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์‚ฌ์šฉ๋Ÿ‰ ์ˆ˜์น˜๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

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

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

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

ํŠน์ • ์˜ˆ์•ฝ์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋Ÿ‰์€ WHERE reservation_id = "โ€ฆ"๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์˜ˆ์•ฝ ์‚ฌ์šฉ ๋น„์œจ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ƒ์œ„ ์ž‘์—…์€ ํ•˜์œ„ ์ž‘์—…์˜ ์ด ์Šฌ๋กฏ ์‚ฌ์šฉ๋Ÿ‰๋„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋ฐฉ์ง€๋˜๋„๋ก WHERE statement_type != "SCRIPT"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ์ž‘์—…์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ์ž‘์—…์˜ ํ‰๊ท  ์Šฌ๋กฏ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๋ ค๋ฉด total_slot_ms / TIMESTAMP_DIFF(end_time, start_time, MILLISECOND)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์šฐ์„ ์ˆœ์œ„๋ณ„ ์ตœ๊ทผ ํ™œ์„ฑ ์ฟผ๋ฆฌ ์ˆ˜

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์ง€๋‚œ 7์‹œ๊ฐ„ ์ด๋‚ด์— ์‹œ์ž‘๋œ ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ์šฐ์„ ์ˆœ์œ„(๋Œ€ํ™”ํ˜• ๋˜๋Š” ์ผ๊ด„)๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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;

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

+-------------+-------------+
| priority    | active_jobs |
+-------------+-------------+
| INTERACTIVE |           2 |
| BATCH       |           3 |
+-------------+-------------+

priority ํ•„๋“œ๋Š” ์ฟผ๋ฆฌ๊ฐ€ INTERACTIVE์ธ์ง€ BATCH์ธ์ง€ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋กœ๋“œ ์ž‘์—… ๊ธฐ๋ก ๋ณด๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์˜ ์ผ๊ด„ ๋กœ๋“œ ์ž‘์—…์„ ์ œ์ถœํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๊ฒฝ๊ณ„๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด ์ฟผ๋ฆฌ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ธฐ๋ก์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

SELECT
  user_email AS user,
  COUNT(*) num_jobs
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  job_type = 'LOAD'
GROUP BY
  user_email;

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

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

๋กœ๋“œ ์ž‘์—… ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ๋œ ์ผ์ผ ์ž‘์—… ํ• ๋‹น๋Ÿ‰ ํ™•์ธ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ผ์ผ ์ž‘์—… ํ• ๋‹น๋Ÿ‰์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ ์งœ, ๋ฐ์ดํ„ฐ ์„ธํŠธ, ํ…Œ์ด๋ธ”๋ณ„๋กœ ์ž‘์—… ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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;
์ฐธ๊ณ : `INFORMATION_SCHEMA` ๋ทฐ ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
+-------------+------------+-------------+----------+-----------------+
|day          | project_id | dataset_id  | table_id | load_job_count  |
+-------------+------------+-------------+----------+-----------------+
| 2020-10-10  | my_project | dataset1    | orders   | 58              |
| 2020-10-10  | my_project | dataset1    | product  | 20              |
| 2020-10-10  | my_project | dataset1    | sales    | 11              |
+-------------+------------+-------------+----------+-----------------+

์ตœ๊ทผ ์‹คํŒจํ•œ ์ž‘์—… ๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ตœ๊ทผ ์‹คํŒจํ•œ ์ž‘์—… 3๊ฐœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

+------------+--------------------------+------------------+-------------------------------------+
| job_id     | creation_time            | user_email       | error_result                        |
+------------+--------------------------+------------------+-------------------------------------+
| bquxjob_1  | 2020-10-10 00:00:00 UTC  | abc@example.com  | Column 'col1' has mismatched type...|
| bquxjob_2  | 2020-10-11 00:00:00 UTC  | xyz@example.com  | Column 'col1' has mismatched type...|
| bquxjob_3  | 2020-10-11 00:00:00 UTC  | bob@example.com  | Column 'col1' has mismatched type...|
+------------+--------------------------+------------------+-------------------------------------+

์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—… ๋ชฉ๋ก ์ฟผ๋ฆฌ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” 30๋ถ„ ์ด์ƒ RUNNING ๋˜๋Š” PENDING ์ƒํƒœ์ธ ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—… ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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;

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

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

์„ ํƒ์  ์ž‘์—… ์ƒ์„ฑ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” 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 3;

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

+-----------+
| job_id    |                                          |
+-----------+
| bquxjob_1 |
| bquxjob_2 |
| bquxjob_3 |
+-----------+

๋‹ค์Œ ์˜ˆ์‹œ๋Š” 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

์ฐธ๊ณ : ์ด ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ž‘์—…์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ job_id ํ•„๋“œ์— ์ฟผ๋ฆฌ์˜ queryId๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

+-----------+----------------+-------------+-----------+--------------------------+--------------------+---------------------+---------------+-------+----------------------+
| job_id    | statement_type | priority    | cache_hit | job_creation_reason_code | total_bytes_billed | total_bytes_processed | total_slot_ms | state | error_result_message |
+-----------+----------------+-------------+-----------+--------------------------+--------------------+---------------------+---------------+-------+----------------------+
| bquxjob_1 | SELECT         | INTERACTIVE | false     | null                     | 161480704          | 161164718             | 3106          | DONE  | null                 |
+-----------+----------------+-------------+-----------+--------------------------+--------------------+---------------------+---------------+-------+----------------------+

๋‹ค์Œ ์˜ˆ์‹œ๋Š” BigQuery์—์„œ ์ž‘์—…์„ ๋งŒ๋“  ์„ ํƒ์  ์ž‘์—… ์ƒ์„ฑ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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 3

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

+-----------+--------------------------+
| job_id    | job_creation_reason_code |
+-----------+--------------------------+
| bquxjob_1 | LARGE_RESULTS            |
| bquxjob_2 | LARGE_RESULTS            |
| bquxjob_3 | LARGE_RESULTS            |
+-----------+--------------------------+

์‚ฌ์šฉ์ž ID๋‹น ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐ”์ดํŠธ ์ˆ˜

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์‚ฌ์šฉ์ž๋‹น ์ฟผ๋ฆฌ ์ž‘์—…์— ๋Œ€ํ•ด ์ฒญ๊ตฌ๋˜๋Š” ์ด ๋ฐ”์ดํŠธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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;

์ฐธ๊ณ : JOBS ๋ทฐ์— ๋Œ€ํ•ด ์Šคํ‚ค๋งˆ ๋ฌธ์„œ์—์„œ total_bytes_billed ์—ด์— ๋Œ€ํ•œ ์ฃผ์˜ ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์ฒ˜๋ฆฌ๋œ ๋ฐ”์ดํŠธ์˜ ์‹œ๊ฐ„๋ณ„ ๋ถ„๋ฅ˜

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ฟผ๋ฆฌ ์ž‘์—…์— ๋Œ€ํ•ด ์ฒญ๊ตฌ๋˜๋Š” ์ด ๋ฐ”์ดํŠธ๋ฅผ ์‹œ๊ฐ„๋ณ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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;

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

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

ํ…Œ์ด๋ธ”๋‹น ์ฟผ๋ฆฌ ์ž‘์—… ์ˆ˜

๋‹ค์Œ ์˜ˆ์‹œ๋Š” my_project์— ์ฟผ๋ฆฌ๋œ ๊ฐ ํ…Œ์ด๋ธ”์ด ์ฟผ๋ฆฌ ์ž‘์—…์œผ๋กœ ์ฐธ์กฐ๋œ ํšŸ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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;

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

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

ํ”„๋กœ์ ํŠธ๋ณ„ ๊ธฐ์กด SQL ์ฟผ๋ฆฌ ์ž‘์—… ์ˆ˜

INFORMATION_SCHEMA์˜ 'query_dialect' ํ•„๋“œ๋Š” 2025๋…„ 5์›”์— ์ œ๊ณต๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‹คํ–‰๋œ ๊ธฐ์กด SQL ์ฟผ๋ฆฌ ์ž‘์—… ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SELECT
  project_id,
  -- Implicitly defaulted to LegacySQL since the query dialect was not specified
  -- in the request.
  COUNTIF(query_dialect = 'DEFAULT_LEGACY_SQL') AS default_legacysql_query_jobs,
  -- Explicitly requested LegacySQL.
  COUNTIF(query_dialect = 'LEGACY_SQL') AS legacysql_query_jobs,
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  query_dialect = 'DEFAULT_LEGACY_SQL'
  OR query_dialect = 'LEGACY_SQL'
GROUP BY
  project_id
ORDER BY
  default_legacysql_query_jobs DESC,
  legacysql_query_jobs DESC;

ํ…Œ์ด๋ธ”๋‹น ์ฟผ๋ฆฌ ๋ฐ ๋กœ๋“œ ์ž‘์—…์œผ๋กœ ์ˆ˜์ •๋œ ํŒŒํ‹ฐ์…˜ ์ˆ˜

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ…Œ์ด๋ธ”๋งˆ๋‹ค DML ๋ฌธ๊ณผ ๋กœ๋“œ ์ž‘์—…์ด ์žˆ๋Š” ์ฟผ๋ฆฌ๋กœ ์ˆ˜์ •๋œ ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์ฟผ๋ฆฌ์—๋Š” ๋ณต์‚ฌ ์ž‘์—…์˜ total_modified_partitions๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ž‘์—…์—์„œ ์‚ฌ์šฉํ•œ ๋ฐ€๋ฆฌ์ดˆ๋‹น ํ‰๊ท  ์Šฌ๋กฏ ์ˆ˜

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์‹คํ–‰ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•œ ํ‰๊ท  ์Šฌ๋กฏ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋Š” ๋А๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ฟผ๋ฆฌ์˜ ๋А๋ฆฐ ์‹คํ–‰์„ ๋™์ผํ•œ ์ฟผ๋ฆฌ์˜ ๋น ๋ฅธ ์‹คํ–‰๊ณผ ๋น„๊ตํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์ด ์˜ˆ์•ฝ ํฌ๊ธฐ ๋ฐ ํ”„๋กœ์ ํŠธ ๋˜๋Š” ์˜ˆ์•ฝ ๋‚ด์—์„œ ์‹คํ–‰๋œ ๋™์‹œ ์ž‘์—…์˜ ํ‰๊ท  ์ˆ˜์™€ ๋น„๊ตํ•˜๋ฉด ์‹คํ–‰ ์ค‘์— ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๊ฐ€ ๋™์‹œ์— ์Šฌ๋กฏ์„ ๋†“๊ณ  ๊ฒฝ์Ÿํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‰๊ท  ์Šฌ๋กฏ ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ž‘์—…์— ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์•„์ง€๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

SELECT ROUND(SAFE_DIVIDE(total_slot_ms,TIMESTAMP_DIFF(end_time, start_time, MILLISECOND)), 1) as avg_slots_per_ms
FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE job_id = 'JOB_ID'

JOB_ID์„ ์กฐ์‚ฌ ์ค‘์ธ job_id๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

+------------------+
| avg_slots_per_ms |
+------------------+
|             17.0 |
+------------------+

ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ๋น„์šฉ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋“œ๋Š” ์ฟผ๋ฆฌ

๋‹ค์Œ ์˜ˆ์‹œ์—๋Š” ์Šฌ๋กฏ ์‚ฌ์šฉ ์‹œ๊ฐ„๋ณ„๋กœ my_project์—์„œ ๋น„์šฉ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋“œ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

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 3

๋‹ค์Œ ์˜ˆ์‹œ๋กœ ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ณ„๋กœ ๋น„์šฉ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋“œ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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 3

๋‘ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

+-----------+---------------------------------+-----------------------+---------------+
| job_id    | query                           | user_email            | total_slot_ms |
+-----------+---------------------------------+--------------------------+------------+
| bquxjob_1 | SELECT ... FROM dataset.table1  | bob@example.com       | 80,000        |
| bquxjob_2 | SELECT ... FROM dataset.table2  | alice@example.com     | 78,000        |
| bquxjob_3 | SELECT ... FROM dataset.table3  | charles@example.com   | 75,000        |
+-----------+---------------------------------+-----------------------+---------------+

๋ฆฌ์†Œ์Šค ๊ฒฝ๊ณ ์— ๋Œ€ํ•œ ์„ธ๋ถ€์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

๋ฆฌ์†Œ์Šค ์ดˆ๊ณผ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์ผ์ • ๊ธฐ๊ฐ„์˜ ์ฟผ๋ฆฌ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ ์งœ๋ณ„๋กœ ๊ทธ๋ฃนํ™”๋œ ๋ฆฌ์†Œ์Šค ๊ฒฝ๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง

๋ฆฌ์†Œ์Šค ์ดˆ๊ณผ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋‚ ์งœ๋ณ„๋กœ ๊ทธ๋ฃนํ™”๋œ ๋ฆฌ์†Œ์Šค ๊ฒฝ๊ณ ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ์— ๋ณ€๊ฒฝ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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;

์ฟผ๋ฆฌ์˜ ์Šฌ๋กฏ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๋น„์šฉ ์˜ˆ์ƒ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” estimated_runnable_units๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ž‘์—…์˜ ํ‰๊ท  ์Šฌ๋กฏ๊ณผ ์ตœ๋Œ€ ์Šฌ๋กฏ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์•ฝ์ด ์—†์œผ๋ฉด reservation_id๊ฐ€ NULL์ž…๋‹ˆ๋‹ค.

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' OR statement_type IS NULL)
  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;

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

+-----------+-----------+----------------+---------------+----------------------+----------+-----------------+--------------------+--------------+--------------------------------+--------------------+--------------------------+
|project_id | job_id    | reservation_id | creation_date | job_duration_seconds | job_type | user_email      | total_bytes_billed | job_avg_slots| query                          | jobstage_max_slots | estimated_runnable_units |
+-----------+-----------+----------------+---------------+----------------------+----------+-----------------+--------------------+--------------+--------------------------------+--------------------+--------------------------+
| project1  | bquxjob1  | reservation1   | 2020-10-10    | 160                  | LOAD     | abc@example.com | 161480704          | 2890         | SELECT ... FROM dataset.table1 | 2779.1534          | 8293                     |
| project1  | bquxjob2  | reservation2   | 2020-12-10    | 120                  | LOAD     | abc@example.com | 161480704          | 2890         | SELECT ... FROM dataset.table1 | 2779.1534          | 8768                     |
| project1  | bquxjob3  | reservation1   | 2020-12-10    | 120                  | LOAD     | abc@example.com | 161480704          | 2890         | SELECT ... FROM dataset.table1 | 1279.1534          | 8738                     |
+-----------+-----------+----------------+---------------+----------------------+----------+-----------------+--------------------+--------------+--------------------------------+--------------------+--------------------------+

์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ†ต๊ณ„ ๋ณด๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” Google Cloud ์ฝ˜์†”์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ทธ๋ž˜ํ”„์— ์—ฐ๊ฒฐ๋˜๋Š” URL๊ณผ ํ•จ๊ป˜ ์ง€๋‚œ 30์ผ ๋™์•ˆ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ํ†ต๊ณ„๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ ์ž‘์—…์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒˆ๋กœ๊ณ ์นจ ์ž‘์—… ๋ณด๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ง€๋‚œ 6์‹œ๊ฐ„ ๋™์•ˆ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒˆ๋กœ๊ณ ์นจ ์ž‘์—…์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SELECT
 *
FROM
 `region-REGION_NAME`.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;

REGION_NAME์„ ํ˜„์žฌ ๋ฆฌ์ „์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋™์ผํ•œ ์ฟผ๋ฆฌ์˜ ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ๋ถ„์„

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ง€๋‚œ 7์ผ ๋™์•ˆ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ์ž‘์—… ์ค‘ ๊ฐ€์žฅ ๋А๋ฆฐ ์ž‘์—… 10๊ฐœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

JOB_ID๋ฅผ ๋ถ„์„ ์ค‘์ธ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ job_id๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๊ฐ€์žฅ ๋งŽ์€ ๋ฐ”์ดํŠธ๋ฅผ ์Šค์บ”ํ•œ ์ƒ์œ„ 5๊ฐœ ์ž‘์—…

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์˜ค๋Š˜ ๋‚ ์งœ์˜ ์กฐ์ง์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ๋ฐ”์ดํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•œ ์ž‘์—… 5๊ฐœ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋กœ๋“œ, ๋‚ด๋ณด๋‚ด๊ธฐ, ์ฟผ๋ฆฌ์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฟผ๋ฆฌํ•˜๋ ค๋ฉด statement_type์„ ์ถ”๊ฐ€๋กœ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT
  job_id,
  user_email,
  total_bytes_billed
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION
WHERE
  EXTRACT(DATE FROM  creation_time) = current_date()
ORDER BY
  total_bytes_billed DESC
LIMIT 3;

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

+--------------+--------------+---------------------------+
| job_id       |  user_email  |  total_bytes_billed       |
+--------------+--------------+---------------------------+
| bquxjob_1    |  abc@xyz.com |    999999                 |
| bquxjob_2    |  def@xyz.com |    888888                 |
| bquxjob_3    |  ghi@xyz.com |    777777                 |
+--------------+--------------+---------------------------+

๋Œ€๊ธฐ ์ค‘์ด๊ฑฐ๋‚˜ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—… ๋ณด๊ธฐ

SELECT
  job_id,
  creation_time,
  query
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_USER
WHERE
  state != 'DONE';

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

+--------------+---------------------------+---------------------------------+
| job_id       |  creation_time            |  query                          |
+--------------+---------------------------+---------------------------------+
| bquxjob_1    |  2019-10-10 00:00:00 UTC  |  SELECT ... FROM dataset.table1 |
| bquxjob_2    |  2019-10-10 00:00:01 UTC  |  SELECT ... FROM dataset.table2 |
| bquxjob_3    |  2019-10-10 00:00:02 UTC  |  SELECT ... FROM dataset.table3 |
+--------------+---------------------------+---------------------------------+

๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ํŠน์ • ์ž‘์—…๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” ํ‰๊ท  ๋™์‹œ ์ž‘์—… ๋ณด๊ธฐ

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ํŠน์ • ์ฟผ๋ฆฌ ์ž‘์—…๊ณผ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ž‘์—…์˜ ํ‰๊ท  ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด ๊ณ„์‚ฐ์€ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ ๋‚ด ๋™์‹œ ์ž‘์—… ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ์Šฌ๋กฏ ๊ฒฝํ•ฉ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋А๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋А๋ฆฐ ์ฟผ๋ฆฌ์™€ ๋น ๋ฅธ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ๋น„๊ตํ•  ๋•Œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์„ธ์š”.

์˜ˆ์ƒ๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ๋™์‹œ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์‹œ์ž‘๋œ ์ž‘์—…์ด ๋” ๋งŽ๊ฑฐ๋‚˜, ์ฟผ๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” ๋‘˜ ๋‹ค์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

WITH job_metadata AS (
 SELECT creation_time, end_time, job_type
 FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
 WHERE job_id = 'JOB_ID'
-- If you know the date the job was created, add the following line to speed up the query by providing the date in UTC:
-- AND DATE(creation_time) = 'YYYY-MM-DD'
),
intervals AS (
 SELECT TIMESTAMP_ADD(creation_time, INTERVAL (seconds_offset) SECOND) AS ts,
 job_type
 FROM job_metadata,
 UNNEST (GENERATE_ARRAY(0, IF(TIMESTAMP_DIFF(end_time, creation_time, SECOND) > 0, TIMESTAMP_DIFF(end_time, creation_time, SECOND), 1))) as seconds_offset
),
concurrent_jobs AS (
 SELECT int.ts, COUNT(*) as concurrent_jobs_count
 FROM intervals int JOIN
 `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT j
 ON int.ts BETWEEN j.creation_time and j.end_time
 WHERE job_id != 'JOB_ID'
 AND j.job_type = int.job_type
 GROUP BY int.ts)

SELECT ROUND(AVG(concurrent_jobs_count),1) as average_concurrent_jobs FROM concurrent_jobs

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • JOB_ID: ๋ถ„์„ ์ค‘์ธ ์ฟผ๋ฆฌ์˜ ์ž‘์—… ID

  • REGION_NAME: ํ”„๋กœ์ ํŠธ ๋ฆฌ์ „

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

+-------------------------+
| average_concurrent_jobs |
+-------------------------+
|                     2.8 |
+-------------------------+

๋‚ด๋ณด๋‚ด๊ธฐ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๋ฐ”์ดํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” EXTRACT ์ž‘์—… ์œ ํ˜•์˜ total_bytes_processed ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ ์ž‘์—… ํ• ๋‹น๋Ÿ‰์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚ด๋ณด๋‚ด๊ธฐ ์ž‘์—… ํ• ๋‹น๋Ÿ‰ ์ •์ฑ…์„ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์ฒ˜๋ฆฌ๋œ ์ด ๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง‘๊ณ„ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋‚ด๋ณด๋‚ด๊ธฐ ์ž‘์—…์„ ์ผ์ผ 50TB ํ•œ๋„ ์ดํ•˜๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT
    DATE(creation_time) as day,
    project_id as source_project_id,
    SUM(total_bytes_processed) AS total_bytes_processed
 FROM
   `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
 WHERE
    creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND CURRENT_TIMESTAMP()
    AND job_type = "EXTRACT"
GROUP BY
    day,
    source_project_id
ORDER BY
    day DESC;

๋ณต์‚ฌ ์ž‘์—… ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ€์ ธ์˜ค๊ธฐ

๋ณต์‚ฌ ์ž‘์—…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…Œ์ด๋ธ” ๋ณต์‚ฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. ๋‹ค์Œ์€ ๋ณต์‚ฌ ์ž‘์—…์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ฐ€์ ธ์˜ค๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

SELECT
    DATE(creation_time) as day,
    project_id as source_project_id,
CONCAT(destination_table.project_id,":",destination_table.dataset_id,".",destination_table.table_id) as destination_table,
    COUNT(job_id) AS copy_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 = "COPY"
GROUP BY
    day,
    source_project_id,
    destination_table
ORDER BY
    day DESC;

BigQuery ์Šคํ† ๋ฆฌ์ง€ ์ตœ์ ํ™”์—์„œ Apache Iceberg์šฉ BigLake ํ…Œ์ด๋ธ” ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” BigQuery ์Šคํ† ๋ฆฌ์ง€ ์ตœ์ ํ™”์—์„œ BigLake Iceberg ํ…Œ์ด๋ธ”์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

SELECT
    job_id, reservation_id, edition,
    total_slot_ms, total_bytes_processed, state
FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
    AND user_email = "bigquery-adminbot@system.gserviceaccount.com"
    AND query LIKE "CALL BQ.OPTIMIZE_STORAGE(%)";

BigQuery ๋‚ด๋ณด๋‚ด๊ธฐ ํ…Œ์ด๋ธ” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ BigLake Iceberg ํ…Œ์ด๋ธ” ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” Iceberg EXPORT TABLE METADATA FROM์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

SELECT
   job_id,
   user_email,
   start_time,
   end_time,
   TIMESTAMP_DIFF(end_time, start_time, SECOND) AS duration_seconds,
   total_bytes_processed,
   reservation_id,
   CASE
     WHEN reservation_id IS NULL THEN 'PAYG (On-demand)'
     WHEN reservation_id != '' THEN 'Reservation'
     ELSE 'Unknown'
   END AS compute_type,
   query
 FROM
   `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
 WHERE
   job_type = 'QUERY'
   AND end_time IS NOT NULL
   -- Filter for queries containing the specified pattern (case-insensitive)
   AND REGEXP_CONTAINS(LOWER(query), r"export table metadata from")
 ORDER BY
   start_time DESC
 LIMIT 3;

๊ด€๋ฆฌ ๋ฆฌ์†Œ์Šค ์ฐจํŠธ์˜ ์Šฌ๋กฏ ์‚ฌ์šฉ ๋™์ž‘ ์ผ์น˜

๊ด€๋ฆฌ ๋ฆฌ์†Œ์Šค ์ฐจํŠธ์˜ ์ •๋ณด์™€ ์œ ์‚ฌํ•œ ์Šฌ๋กฏ ์‚ฌ์šฉ ๋™์ž‘์„ ์‚ดํŽด๋ณด๋ ค๋ฉด INFORMATION_SCHEMA.JOBS_TIMELINE ๋ทฐ๋ฅผ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.