Kueri global

Kueri global memungkinkan Anda menjalankan kueri SQL yang mereferensikan data yang disimpan di lebih dari satu region. Misalnya, Anda dapat menjalankan kueri global yang menggabungkan tabel yang terletak di us-central1 dengan tabel yang terletak di europe-central2. Dokumen ini menjelaskan cara mengaktifkan dan menjalankan kueri global di project Anda.

Sebelum memulai

Pastikan kueri global diaktifkan untuk project Anda dan pastikan Anda memiliki izin yang diperlukan untuk menjalankan kueri global.

Mengaktifkan kueri global

Untuk mengaktifkan kueri global bagi project atau organisasi Anda, gunakan pernyataan ALTER PROJECT SET OPTIONS atau pernyataan ALTER ORGANIZATION SET OPTIONS untuk mengubah konfigurasi default.

  • Untuk menjalankan kueri global di suatu region, tetapkan argumen enable_global_queries_execution ke true di region tersebut untuk project yang menjalankan kueri.
  • Untuk mengizinkan kueri global menyalin data dari suatu region, tetapkan argumen enable_global_queries_data_access ke true di region tersebut untuk project yang berisi data.
  • Setiap kali kueri Anda mengakses tabel jarak jauh, opsi ini akan diperiksa.
  • Kueri global dapat berjalan di satu project dan mengambil data dari region lain dari project lain.

Contoh: Konfigurasi lintas project

Contoh berikut menunjukkan cara menjalankan kueri dalam satu project yang mengakses tabel di project lain.

Misalnya, Anda memiliki project query_project yang menjalankan tugas di region us-central1, dan Anda ingin menjalankan kueri yang mengakses tabel data_project.dataset.my_table yang terletak di region europe-west1:

SET @@location='us-central1';
SELECT
  *
FROM
  `query_project.dataset.my_table`
  JOIN `data_project.dataset.my_other_table` USING id;

Agar kueri global ini berhasil dijalankan, konfigurasi berikut diperlukan:

  1. Anda harus mengaktifkan eksekusi kueri global dalam project (query_project) di region yang menjalankan kueri global (us-central1):

    ALTER PROJECT `query_project`
    SET OPTIONS (
    `region-us-central1.enable_global_queries_execution` = TRUE
    )
  2. Anda harus mengaktifkan penyalinan data dengan kueri global dari project yang berisi data (data_project) untuk regionnya (europe-west1):

    ALTER PROJECT `data_project`
    SET OPTIONS (
    `region-europe-west1.enable_global_queries_data_access` = TRUE
    )

Untuk membuat dan menggunakan tampilan yang berisi tabel jarak jauh, prinsip yang sama berlaku: project yang menjalankan kueri harus mengaktifkan enable_global_queries_execution.

Operasi ALTER PROJECT ini harus dijalankan secara terpisah karena merujuk ke project dan region yang berbeda. Mungkin perlu waktu beberapa menit agar perubahan diterapkan.

Izin yang diperlukan

Untuk menjalankan kueri global, Anda harus memiliki izin bigquery.jobs.createGlobalQuery. Peran BigQuery Admin adalah satu-satunya peran bawaan yang berisi izin ini. Untuk memberikan izin menjalankan kueri global tanpa memberikan peran BigQuery Admin, ikuti langkah-langkah berikut:

  1. Buat peran khusus, misalnya "BigQuery global queries executor".
  2. Tambahkan bigquery.jobs.createGlobalQuery ke peran ini.
  3. Tetapkan peran ini ke pengguna atau akun layanan yang dipilih.

Data kueri

Untuk menjalankan kueri global, Anda menulis kueri SQL seperti yang Anda lakukan jika data Anda berada di satu lokasi. Jika data yang direferensikan oleh kueri disimpan di lebih dari satu lokasi, BigQuery akan mencoba menjalankan kueri global. Jika Anda tidak menentukan lokasi untuk menjalankan kueri, BigQuery akan otomatis memilih lokasi berdasarkan lokasi tabel yang direferensikan. Untuk mengetahui informasi selengkapnya, lihat Memilih lokasi. Data yang direferensikan oleh kueri yang tidak berada di lokasi yang dipilih akan disalin ke lokasi tersebut.

Contoh berikut berjalan sebagai kueri global yang menggabungkan tabel dari dua set data berbeda yang disimpan di dua lokasi berbeda:

SELECT id, tr_date, product_id, price FROM us_dataset.transactions
UNION ALL
SELECT id, tr_date, product_id, price FROM europe_dataset.transactions

Pilih lokasi

Untuk mengonfigurasi tempat kueri global akan dijalankan, tentukan lokasi. Saat Anda memutuskan lokasi eksekusi untuk kueri global, pertimbangkan hal berikut:

  • Residensi data: kueri global menyalin data untuk sementara dari satu lokasi ke lokasi lain. Jika organisasi Anda memiliki persyaratan untuk residensi data, dan Anda tidak ingin data Anda keluar dari lokasi tertentu, tetapkan lokasi kueri ke lokasi tersebut.

  • Biaya dan performa transfer: untuk meminimalkan jumlah data yang ditransfer antar-lokasi dan mengurangi biaya kueri, jalankan kueri Anda di region tempat sebagian besar data yang dikueri disimpan.

    Misalnya, Anda memiliki toko online dan menyimpan daftar produk di lokasi us-central1, tetapi menyimpan transaksi di region us-south1. Jika ada lebih banyak transaksi daripada produk di katalog, Anda harus menjalankan kueri di region us-south1.

  • Pemesanan dan kapasitas komputasi: tentukan lokasi kueri untuk mengontrol pemesanan atau slot regional mana yang memproses kueri.

Jika Anda tidak menentukan lokasi secara manual, BigQuery akan otomatis menentukan lokasi eksekusi berdasarkan kriteria berikut:

  • Untuk kueri bahasa modifikasi data (DML) (pernyataan INSERT, UPDATE, dan DELETE), lokasi tabel target dipilih sebagai lokasi eksekusi.
  • Untuk kueri bahasa definisi data (DDL) (seperti pernyataan CREATE TABLE AS SELECT), lokasi tempat resource dibuat atau diubah dipilih sebagai lokasi eksekusi.
  • Untuk kueri dengan tabel tujuan yang ditentukan, lokasi tabel tujuan dipilih sebagai lokasi eksekusi.
  • Untuk semua kueri lainnya, lokasi eksekusi dipilih secara arbitrer sebagai salah satu lokasi set data yang direferensikan.

Memahami kueri global

Untuk menjalankan kueri global secara efisien dan hemat biaya, penting untuk memahami mekanisme di balik eksekusinya.

Untuk menggunakan data yang berada di lokasi berbeda, data tersebut harus direplikasi ke satu lokasi. Berikut adalah abstraksi alur kerja kueri global yang dilakukan oleh BigQuery:

  1. Tentukan tempat kueri harus dijalankan, baik dari deklarasi pengguna atau secara otomatis. Lokasi ini disebut lokasi utama, dan semua lokasi lain yang dirujuk oleh kueri bersifat jarak jauh.
  2. Menjalankan subkueri di setiap region jarak jauh untuk mengumpulkan data yang diperlukan guna menyelesaikan kueri di region utama.
  3. Salin data ini dari lokasi jarak jauh ke lokasi utama.
  4. Simpan data dalam tabel sementara di lokasi utama selama 24 jam. Untuk hasil subkueri yang lebih kecil dari 10 GiB, data dapat di-cache untuk digunakan kembali guna menghindari transfer data antar-region.
  5. Jalankan kueri akhir dengan semua data yang dikumpulkan di lokasi utama.
  6. Menampilkan hasil kueri.

BigQuery mencoba meminimalkan jumlah data yang ditransfer antar-region. Perhatikan contoh berikut:

SET @@location = 'EU';
SELECT
  t1.col1, t2.col2
FROM
  eu_dataset.table1 t1
  JOIN us_dataset.table2 t2 using col3
WHERE
  t2.col4 = 'ABC'

BigQuery tidak perlu mereplikasi semua tabel t2 dari AS ke Uni Eropa. Cukup mentransfer kolom yang diminta saja (col2 dan col3) dan hanya baris yang cocok dengan kondisi WHERE (t2.col4 = 'ABC'). Namun, mekanisme ini, yang dikenal sebagai pushdown, bergantung pada struktur kueri dan terkadang jumlah transfer data mungkin besar. Sebaiknya uji kueri global pada subset data kecil dan pastikan data hanya ditransfer saat diperlukan.

Kemampuan observasi

Untuk memantau kueri global dan memeriksa eksekusinya di seluruh region, Anda dapat menggunakan metode berikut:

Histori tugas

Untuk melihat teks kueri yang dikirim ke region jarak jauh, periksa histori tugas. Tugas jarak jauh memiliki ID tugas yang sama dengan kueri asli dengan akhiran _xregion tambahan.

REST API Jobs

Saat Anda memanggil metode jobs.get, resource Job yang ditampilkan akan berisi kolom berikut dalam objek JobStatistics:

  • statistics.globalQueryRemoteRegions: Array string yang mewakili region jarak jauh tempat kueri global mengakses data. Kolom ini hanya diisi untuk tugas kueri global induk di region eksekusi utama. Kolom ini kosong untuk tugas kueri global turunan dan kueri satu region.
  • statistics.parentGlobalQueryJob: Objek JobReference (projectId, jobId, location) yang mengidentifikasi tugas kueri global induk. Kolom ini hanya diisi untuk tugas kueri global turunan (subkueri jarak jauh dan tugas penyalinan lintas region) yang dijalankan di region jarak jauh atas nama kueri global. Nilai ini tidak ditetapkan untuk tugas kueri global induk dan kueri satu region.

Log audit

Di Cloud Audit Logs, objek BigQueryAuditMetadata berisi kolom berikut dalam objek JobStats:

  • jobStats.globalQueryRemoteRegions: Array string yang mewakili region jarak jauh yang diakses oleh kueri. Kolom ini hanya diisi untuk tugas kueri global induk di region eksekusi utama.
  • jobStats.parentGlobalQueryJobId: ID pekerjaan dari tugas kueri global induk. Kolom ini diisi untuk tugas turunan yang dijalankan di region jarak jauh.
  • jobStats.parentGlobalQueryJobLocation: Lokasi tugas kueri global induk. Kolom ini diisi untuk tugas turunan yang dijalankan di region jarak jauh.

Menemukan tugas turunan jarak jauh untuk kueri global

Untuk menemukan semua tugas turunan jarak jauh yang terkait dengan kueri global induk, Anda dapat mengkueri log audit menggunakan Log Analytics atau set data sink log yang diekspor:

SELECT
  timestamp,
  proto_payload.audit_log.resource_name AS resource_name,
  JSON_VALUE(proto_payload.audit_log.metadata.jobChange.job.jobConfig.queryConfig.query) AS query
FROM
  `PROJECT_ID.LOG_DATASET._AllLogs`
WHERE
  JSON_VALUE(proto_payload.audit_log.metadata.jobChange.job.jobStats.parentGlobalQueryJobId) = 'PARENT_JOB_ID';

Ganti kode berikut:

  • PROJECT_ID: Project ID Google Cloud Anda.
  • LOG_DATASET: set data tertaut BigQuery untuk Log Analytics atau set data tujuan sink log.
  • PARENT_JOB_ID: ID pekerjaan dari tugas kueri global induk.

Tampilan INFORMATION_SCHEMA

Anda dapat mengkueri tampilan INFORMATION_SCHEMA.JOBS dan INFORMATION_SCHEMA.JOBS_TIMELINE untuk memeriksa metadata kueri global. Kolom global_query_info berisi kolom berikut:

  • parent_job_id: ID tugas kueri global induk di region utama. Kolom ini diisi untuk subkueri turunan dan tugas penyalinan yang dijalankan di region jarak jauh.
  • parent_job_location: Lokasi tugas kueri global induk.
  • remote_regions: Array region jarak jauh yang dirujuk oleh kueri. Kolom ini diisi untuk tugas kueri global induk di region utama.

Mengidentifikasi kueri global di region utama

Untuk menemukan semua kueri global yang dijalankan di region utama dan melihat region jarak jauh mana yang direferensikan, buat kueri tampilan INFORMATION_SCHEMA.JOBS di region utama:

SELECT
  job_id,
  creation_time,
  query,
  total_bytes_billed,
  global_query_info.remote_regions
FROM
  `region-REGION`.INFORMATION_SCHEMA.JOBS
WHERE
  ARRAY_LENGTH(global_query_info.remote_regions) > 0;

Ganti REGION dengan region tempat kueri global dijalankan, seperti us-central1.

Menemukan tugas turunan jarak jauh untuk kueri global

Untuk menemukan semua tugas turunan jarak jauh yang terkait dengan kueri global induk, buat kueri tampilan INFORMATION_SCHEMA.JOBS di region jarak jauh:

SELECT
  job_id,
  project_id,
  job_type,
  statement_type,
  total_bytes_billed,
  total_slot_ms
FROM
  `region-REMOTE_REGION`.INFORMATION_SCHEMA.JOBS
WHERE
  global_query_info.parent_job_id = 'PARENT_JOB_ID';

Ganti kode berikut:

  • REMOTE_REGION: region jarak jauh tempat subkueri turunan atau tugas penyalinan dijalankan, seperti europe-west1.
  • PARENT_JOB_ID: ID pekerjaan dari tugas kueri global induk.

Menonaktifkan kueri global

Untuk menonaktifkan kueri global bagi project atau organisasi Anda, gunakan ALTER PROJECT SET OPTIONS statement atau ALTER ORGANIZATION SET OPTIONS statement untuk mengubah konfigurasi default.

  • Untuk menonaktifkan kueri global di suatu region, tetapkan argumen enable_global_queries_execution ke false atau NULL di region tersebut.
  • Untuk melarang kueri global menyalin data dari suatu region, tetapkan argumen enable_global_queries_data_access ke false atau NULL di region tersebut.

Contoh berikut menunjukkan cara menonaktifkan kueri global di level project:

ALTER PROJECT PROJECT_ID
SET OPTIONS (
  `region-REGION.enable_global_queries_execution` = false,
  `region-REGION.enable_global_queries_data_access` = false
);

Ganti kode berikut:

  • PROJECT_ID: nama project yang akan diubah
  • REGION: nama region tempat kueri global akan dinonaktifkan

Mungkin perlu waktu beberapa menit agar perubahan diterapkan.

Harga

Biaya kueri global terdiri atas komponen berikut:

  • Biaya komputasi setiap subkueri di lokasi jarak jauh, berdasarkan model harga Anda di lokasi tersebut
  • Biaya komputasi kueri akhir di region tempat kueri dijalankan, berdasarkan model harga Anda di region tersebut
  • Biaya penyalinan data antara lokasi yang berbeda, sesuai dengan Harga replikasi data
  • Biaya penyimpanan data yang disalin dari region jarak jauh ke region utama (selama 24 jam), sesuai dengan Harga penyimpanan

Kuota

Untuk mengetahui informasi tentang kuota terkait kueri global, lihat Tugas kueri.

Batasan

  • Kueri global tidak didukung di Assured Workloads.
  • Kueri global tidak didukung saat menggunakan endpoint regional.
  • Kueri global tidak didukung dalam mode sandbox.
  • Kueri global menimbulkan latensi yang lebih tinggi daripada kueri satu region karena waktu yang diperlukan untuk mentransfer data antar-region.
  • Kueri global tidak dijalankan secara atomik. Jika replikasi data berhasil, tetapi kueri secara keseluruhan gagal, Anda tetap akan ditagih untuk replikasi data.
  • Satu kueri global dapat mengakses hingga 10 tabel jarak jauh per region.
  • Tabel sementara yang dibuat di region jarak jauh sebagai bagian dari eksekusi kueri global hanya dienkripsi menggunakan Kunci enkripsi yang dikelola pelanggan (CMEK) jika kunci CMEK yang dikonfigurasi untuk mengenkripsi hasil kueri global (baik di tingkat tabel, set data, atau project) bersifat global. Untuk memastikan bahwa tabel sementara jarak jauh selalu dilindungi menggunakan CMEK, tetapkan kunci KMS default untuk project yang menjalankan kueri global di region jarak jauh.
  • Tampilan yang diotorisasi dan rutinitas yang diotorisasi global tidak didukung (jika tampilan atau rutinitas di satu lokasi diizinkan untuk mengakses set data di lokasi lain). Sebagai gantinya, buat tampilan yang diizinkan di region tempat data Anda berada dan buat kueri tampilan yang diizinkan melalui kueri global.
  • Tampilan terwujud pada kueri global tidak didukung.
  • Anda tidak dapat mengkueri kolom berformat khusus RANGE dengan kueri global.
  • Anda tidak dapat mengkueri kolom semu, seperti _PARTITIONTIME, dengan kueri global.
  • Anda tidak dapat mengkueri kolom menggunakan nama kolom fleksibel dengan kueri global.
  • Jika kueri global Anda mereferensikan kolom STRUCT, pushdown tidak akan diterapkan ke subkueri jarak jauh. Untuk mengoptimalkan performa, pertimbangkan untuk membuat tampilan di region jarak jauh yang memfilter kolom STRUCT dan hanya menampilkan kolom yang diperlukan sebagai kolom individual.
  • Detail eksekusi dan grafik eksekusi kueri tidak menampilkan jumlah byte yang diproses dan ditransfer dari lokasi jarak jauh. Informasi ini muncul dalam tugas penyalinan yang dapat Anda temukan di histori tugas. ID pekerjaan dari tugas penyalinan yang dibuat oleh kueri global memiliki ID pekerjaan dari tugas kueri sebagai awalan.
  • Kueri global hanya didukung di Data Studio jika digabungkan dalam tampilan dan dikonfigurasi untuk menggunakan Kredensial Pelihat.