Membuat kueri tabel yang dikelompokkan
Saat Anda membuat tabel yang dikelompokkan di BigQuery, data tabel akan diatur secara otomatis berdasarkan isi satu atau beberapa kolom dalam skema tabel. Kolom yang Anda tentukan digunakan untuk menempatkan data terkait. Saat Anda mengelompokkan tabel menggunakan beberapa kolom, urutan kolom yang Anda tentukan bersifat penting. Urutan kolom yang ditentukan menentukan tata urutan data.
Untuk mengoptimalkan performa saat Anda menjalankan kueri terhadap tabel yang dikelompokkan, gunakan ekspresi yang memfilter kolom yang dikelompokkan atau di beberapa kolom yang dikelompokkan sesuai urutan penetapan kolom yang dikelompokkan. Kueri yang memfilter kolom yang dikelompokkan umumnya berperforma lebih baik daripada kueri yang hanya memfilter kolom yang tidak dikelompokkan.
BigQuery mengurutkan data dalam tabel yang dikelompokkan berdasarkan pada nilai kolom pengelompokan dan mengelolanya menjadi blok.
Saat Anda mengirimkan kueri yang berisi filter pada kolom yang dikelompokkan, BigQuery menggunakan informasi pengelompokan untuk menentukan secara efisien apakah suatu blok berisi data yang relevan dengan kueri. Hal ini memungkinkan BigQuery memindai blok yang relevan saja, yaitu proses yang disebut dengan pemangkasan blok.
Anda dapat membuat kueri tabel yang dikelompokkan dengan:
- Menggunakan konsol Google Cloud
- Menggunakan perintah
bq query
alat command line bq - Memanggil metode
jobs.insert
dan mengonfigurasi tugas kueri - Menggunakan library klien
Saat ini, Anda hanya dapat menggunakan GoogleSQL dengan tabel yang dikelompokkan.
Go
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.
Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.
Java
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.
Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.
Python
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.
Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.
Izin yang diperlukan
Untuk menjalankan tugas kueri, Anda memerlukan izin Identity and Access Management (IAM) bigquery.jobs.create
pada project yang menjalankan tugas kueri.
Setiap peran IAM bawaan berikut mencakup izin yang Anda perlukan untuk menjalankan tugas kueri:
roles/bigquery.admin
roles/bigquery.jobUser
roles/bigquery.user
Anda juga memerlukan izin bigquery.tables.getData
pada semua tabel dan tampilan yang dirujuk oleh kueri Anda. Selain itu, saat membuat kueri
tampilan, Anda memerlukan izin ini pada semua tabel dan tampilan yang mendasarinya.
Namun, jika menggunakan tampilan yang diotorisasi
atau set data yang diotorisasi, Anda tidak memerlukan
akses ke data sumber yang mendasarinya.
Setiap peran IAM yang telah ditetapkan berikut mencakup izin yang Anda perlukan pada semua tabel dan tampilan yang dirujuk oleh kueri:
roles/bigquery.admin
roles/bigquery.dataOwner
roles/bigquery.dataEditor
roles/bigquery.dataViewer
Untuk informasi selengkapnya tentang peran IAM di BigQuery, lihat Peran dan izin bawaan.
Praktik terbaik
Untuk mendapatkan performa terbaik dari kueri terhadap tabel yang dikelompokkan, gunakan praktik terbaik berikut.
Untuk konteks, tabel contoh yang digunakan dalam contoh praktik terbaik adalah
tabel yang dikelompokkan dan dibuat menggunakan pernyataan DDL. Pernyataan DDL
akan membuat tabel bernama ClusteredSalesData
. Tabel dikelompokkan berdasarkan kolom berikut: customer_id
, product_id
, order_id
, dalam tata urutan tersebut.
CREATE TABLE `mydataset.ClusteredSalesData` PARTITION BY DATE(timestamp) CLUSTER BY customer_id, product_id, order_id AS SELECT * FROM `mydataset.SalesData`
Memfilter kolom yang dikelompokkan menurut tata urutan
Saat Anda menentukan filter, gunakan ekspresi yang memfilter kolom yang dikelompokkan dalam tata urutan. Tata urutan adalah urutan kolom yang diberikan dalam klausa CLUSTER BY
.
Untuk mendapatkan manfaat pengelompokan, sertakan semua kolom
yang dikelompokkan atau subset kolom dalam tata urutan kiri ke kanan, dimulai dengan
kolom pertama. Misalnya, jika tata urutan kolom adalah A
, B
, dan C
, sebuah kueri yang
memfilter A
dan B
mungkin mendapat manfaat dari
pengelompokan, tetapi kueri yang memfilter B
dan C
tidak. Urutan nama kolom di dalam
ekspresi filter tidak memengaruhi performa.
Contoh berikut membuat kueri ke tabel yang dikelompokkan ClusteredSalesData
yang dibuat dalam contoh sebelumnya. Kueri ini mencakup ekspresi
filter yang memfilter customer_id
, lalu product_id
. Kueri ini mengoptimalkan performa dengan memfilter kolom yang dikelompokkan dalam tata urutan, yaitu urutan kolom yang diberikan dalam klausa CLUSTER BY
.
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000 AND product_id LIKE 'gcp_analytics%'
Kueri berikut tidak memfilter kolom yang dikelompokkan dalam tata urutan. Akibatnya, performa kueri tidak optimal. Kueri ini memfilter product_id
, lalu order_id
(melewati customer_id
).
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE product_id LIKE 'gcp_analytics%' AND order_id = 20000
Jangan gunakan kolom yang dikelompokkan dalam ekspresi filter yang kompleks
Jika Anda menggunakan kolom yang dikelompokkan dalam ekspresi filter yang kompleks, performa kueri tidak akan dioptimalkan karena pemangkasan blok tidak dapat diterapkan.
Misalnya, kueri berikut tidak akan memangkas blok karena kolom yang dikelompokkan, customer_id
, digunakan dalam fungsi di ekspresi
filter.
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE CAST(customer_id AS STRING) = "10000"
Untuk mengoptimalkan performa kueri dengan memangkas blok, gunakan ekspresi filter sederhana
seperti berikut. Dalam contoh ini, filter sederhana diterapkan ke
kolom yang dikelompokkan, yaitu customer_id
.
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000
Jangan membandingkan kolom yang dikelompokkan dengan kolom lain
Jika ekspresi filter membandingkan kolom yang dikelompokkan dengan kolom lain (baik kolom yang dikelompokkan maupun kolom yang tidak dikelompokkan), performa kueri tidak akan dioptimalkan karena pemangkasan blok tidak dapat diterapkan.
Kueri berikut tidak memangkas blok karena ekspresi filter membandingkan kolom yang dikelompokkan, customer_id
, dengan kolom lain, order_id
.
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = order_id
Keamanan tabel
Untuk mengontrol akses ke tabel di BigQuery, lihat Pengantar kontrol akses tabel.
Langkah selanjutnya
- Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif dan batch.
- Untuk mempelajari cara membuat dan menggunakan tabel yang dikelompokkan, lihat Membuat dan menggunakan tabel yang dikelompokkan.
- Untuk ringkasan dukungan tabel berpartisi di BigQuery, lihat Pengantar tabel berpartisi.
- Untuk mempelajari cara membuat tabel berpartisi, lihat Membuat tabel berpartisi.