Pengantar tabel berpartisi
Tabel berpartisi dibagi menjadi beberapa segmen, yang disebut partisi, yang mempermudah pengelolaan dan kueri data Anda. Dengan membagi tabel besar menjadi partisi yang lebih kecil, Anda dapat meningkatkan performa kueri dan mengontrol biaya dengan mengurangi jumlah byte yang dibaca oleh kueri. Anda mempartisi tabel dengan menentukan kolom partisi yang digunakan untuk menyegmentasi tabel.
Jika kueri menggunakan filter yang memenuhi syarat pada nilai kolom partisi, BigQuery dapat memindai partisi yang cocok dengan filter dan melewati partisi yang tersisa. Proses ini disebut pruning.
Dalam tabel berpartisi, data disimpan dalam blok fisik, yang masing-masing menyimpan satu partisi data. Setiap tabel berpartisi mempertahankan berbagai metadata tentang properti pengurutan di semua operasi yang mengubahnya. Dengan metadata, BigQuery akan dapat memperkirakan biaya kueri dengan lebih akurat sebelum kueri dijalankan.
Kapan harus menggunakan partisi
Sebaiknya partisi tabel dalam skenario berikut:
- Anda ingin meningkatkan performa kueri dengan hanya memindai sebagian tabel.
- Operasi tabel Anda melebihi kuota tabel standar dan Anda dapat mencakup operasi tabel ke nilai kolom partisi tertentu yang memungkinkan kuota tabel berpartisi yang lebih tinggi.
- Anda ingin menentukan biaya kueri sebelum kueri berjalan. BigQuery memberikan perkiraan biaya kueri sebelum kueri dijalankan pada tabel berpartisi. Hitung perkiraan biaya kueri dengan pruning tabel berpartisi, lalu melakukan uji coba kueri untuk memperkirakan biaya kueri.
- Anda menginginkan salah satu fitur pengelolaan tingkat partisi berikut:
- Menetapkan waktu habis masa berlaku partisi untuk menghapus seluruh partisi secara otomatis setelah jangka waktu tertentu.
- Menulis data ke partisi tertentu menggunakan tugas pemuatan tanpa memengaruhi partisi lain dalam tabel.
- Menghapus partisi tertentu tanpa memindai seluruh tabel.
Pertimbangkan untuk mengelompokkan tabel, bukan mempartisi tabel dalam keadaan berikut:
- Anda membutuhkan lebih banyak perincian daripada yang dimungkinkan oleh pembuatan partisi.
- Kueri Anda biasanya menggunakan filter atau agregasi terhadap beberapa kolom.
- Kardinalitas jumlah nilai dalam kolom atau kelompok kolom berukuran besar.
- Anda tidak memerlukan estimasi biaya yang ketat sebelum eksekusi kueri.
- Partisi akan menghasilkan sejumlah kecil data per partisi (sekitar kurang dari 10 GB). Membuat banyak partisi kecil akan meningkatkan metadata tabel, dan dapat memengaruhi waktu akses metadata saat meng-kueri tabel.
- Partisi akan menghasilkan sejumlah besar partisi, yang melebihi batas pada tabel berpartisi.
- Operasi DML Anda sering mengubah (misalnya, setiap beberapa menit) sebagian besar partisi dalam tabel.
Dalam kasus seperti itu, pengelompokan tabel memungkinkan Anda mempercepat kueri dengan mengelompokkan data di kolom tertentu berdasarkan properti pengurutan yang ditentukan pengguna.
Anda juga dapat menggabungkan pengelompokan dan partisi tabel untuk mendapatkan pengurutan yang lebih terperinci. Untuk informasi selengkapnya tentang pendekatan ini, lihat Menggabungkan tabel yang dikelompokkan dan berpartisi.
Jenis partisi
Bagian ini menjelaskan berbagai cara untuk mempartisi tabel.
Partisi rentang bilangan bulat
Anda dapat mempartisi tabel berdasarkan rentang nilai dalam kolom INTEGER
tertentu. Untuk membuat tabel berpartisi berdasarkan rentang bilangan bulat, berikan:
- Kolom partisi.
- Nilai awal untuk partisi rentang (inklusif).
- Nilai akhir untuk partisi rentang (eksklusif).
- Interval setiap rentang dalam partisi.
Misalnya, Anda membuat partisi rentang bilangan bulat dengan spesifikasi berikut:
Argumen | Nilai |
---|---|
nama kolom | customer_id |
mulai | 0 |
selesai | 100 |
interval | 10 |
Tabel dipartisi pada kolom customer_id
menjadi rentang interval 10.
Nilai 0 hingga 9 masuk ke dalam satu partisi, nilai 10 hingga 19 masuk ke partisi
berikutnya, dll., hingga 99. Nilai di luar rentang ini masuk ke partisi
bernama __UNPARTITIONED__
. Setiap baris yang customer_id
-nya adalah NULL
, akan masuk ke
partisi bernama __NULL__
.
Untuk informasi tentang tabel berpartisi berdasarkan rentang bilangan bulat, lihat Membuat tabel berpartisi berdasarkan rentang bilangan bulat.
Partisi kolom satuan waktu
Anda dapat mempartisi tabel pada kolom DATE
,TIMESTAMP
, atau DATETIME
dalam
tabel. Saat Anda menulis data ke tabel, BigQuery secara otomatis
memasukkan data ke partisi yang benar, berdasarkan nilai dalam kolom tersebut.
Untuk kolom TIMESTAMP
dan DATETIME
, partisi dapat memiliki perincian per jam, harian,
bulanan, atau tahunan. Untuk kolom DATE
, partisi dapat
memiliki perincian harian, bulanan, atau tahunan. Batas partisi didasarkan pada
waktu UTC.
Misalnya, Anda mempartisi tabel pada kolom DATETIME
dengan
partisi bulanan. Jika Anda memasukkan nilai berikut ke dalam tabel,
barisnya akan ditulis ke partisi berikut:
Nilai kolom | Partisi (bulanan) |
---|---|
DATETIME("2019-01-01") |
201901 |
DATETIME("2019-01-15") |
201901 |
DATETIME("2019-04-30") |
201904 |
Selain itu, dua partisi khusus dibuat:
__NULL__
: Berisi baris dengan nilaiNULL
di kolom partisi.__UNPARTITIONED__
: Berisi baris di mana nilai kolom partisi adalah sebelum 1960-01-01 atau setelah 2159-12-31.
Untuk informasi tentang tabel berpartisi berdasarkan kolom satuan waktu, lihat Membuat tabel berpartisi berdasarkan kolom satuan waktu.
Partisi waktu penyerapan
Saat Anda membuat tabel berpartisi berdasarkan waktu penyerapan, BigQuery akan otomatis menetapkan baris ke partisi berdasarkan waktu saat BigQuery menyerap data. Anda dapat memilih perincian per jam, harian, bulanan, atau tahunan untuk partisi. Batas partisi didasarkan pada waktu UTC.
Jika data Anda mungkin mencapai jumlah maksimum partisi per tabel saat menggunakan granularitas waktu yang lebih terperinci, gunakan granularitas yang lebih global. Misalnya, Anda dapat membuat partisi menurut bulan, bukan hari, untuk mengurangi jumlah partisi. Anda juga dapat mengelompokkan kolom partisi untuk lebih meningkatkan performa.
Tabel berpartisi berdasarkan waktu penyerapan memiliki kolom semu bernama _PARTITIONTIME
.
Nilai kolom ini adalah waktu penyerapan untuk setiap baris, yang dipotong sesuai
batas partisi (seperti per jam atau harian). Misalnya, Anda
membuat tabel berpartisi berdasarkan waktu penyerapan dengan partisi per jam dan mengirim
data pada waktu berikut:
Waktu penyerapan | _PARTITIONTIME |
Partisi (per jam) |
---|---|---|
2021-05-07 17:22:00 | 2021-05-07 17:00:00 | 2021050717 |
2021-05-07 17:40:00 | 2021-05-07 17:00:00 | 2021050717 |
2021-05-07 18:31:00 | 2021-05-07 18:00:00 | 2021050718 |
Karena tabel dalam contoh ini menggunakan partisi per jam, nilai
_PARTITIONTIME
akan dipotong menjadi batas jam. BigQuery
menggunakan nilai ini untuk menentukan partisi yang benar untuk data.
Anda juga dapat menulis data ke partisi tertentu. Misalnya, Anda mungkin ingin memuat data historis atau menyesuaikan zona waktu. Anda dapat menggunakan tanggal yang valid antara 0001-01-01 dan 9999-12-31. Namun, pernyataan DML tidak dapat mereferensikan tanggal sebelum 1970-01-01 atau setelah 2159-12-31. Untuk mengetahui informasi selengkapnya, lihat Menulis data ke partisi tertentu.
Selain menggunakan _PARTITIONTIME
, Anda juga dapat menggunakan
_PARTITIONDATE
.
Kolom semu _PARTITIONDATE
berisi tanggal UTC yang sesuai dengan nilai
dalam kolom semu _PARTITIONTIME
.
Memilih partisi harian, per jam, bulanan, atau tahunan
Saat mempartisi tabel berdasarkan kolom satuan waktu atau waktu penyerapan, Anda dapat memilih apakah partisi memiliki perincian harian, per jam, bulanan, atau tahunan.
Partisi harian adalah jenis partisi default. Partisi harian adalah pilihan yang baik jika data Anda tersebar di rentang tanggal yang luas, atau jika data terus ditambahkan dari waktu ke waktu.
Pilih partisi per jam jika tabel Anda memiliki volume data tinggi dengan rentang tanggal pendek — biasanya nilai stempel waktu kurang dari enam bulan. Jika Anda memilih partisi per jam, pastikan jumlah partisi tetap berada dalam batas partisi.
Pilih partisi bulanan atau tahunan jika tabel Anda memiliki jumlah data yang relatif kecil untuk setiap hari, tetapi dengan rentang tanggal yang luas. Opsi ini juga direkomendasikan jika alur kerja Anda memerlukan pembaruan yang sering atau penambahan baris yang mencakup rentang tanggal yang luas (misalnya, lebih dari 500 tanggal). Dalam skenario ini, gunakan partisi bulanan atau tahunan beserta pengelompokan pada kolom partisi untuk mencapai performa terbaik. Untuk mengetahui informasi selengkapnya, baca artikel Menggabungkan tabel yang dikelompokkan dan berpartisi dalam dokumen ini.
Menggabungkan tabel yang dikelompokkan dan berpartisi
Anda dapat menggabungkan partisi tabel dengan pengelompokan tabel guna mencapai pengurutan yang terperinci untuk pengoptimalan kueri lebih lanjut.
Tabel yang dikelompokkan berisi kolom yang dikelompokkan yang mengurutkan data berdasarkan properti pengurutan yang ditentukan pengguna. Data dalam kolom yang dikelompokkan ini diurutkan ke dalam blok penyimpanan yang ukurannya adaptif berdasarkan ukuran tabel. Saat Anda menjalankan kueri yang memfilter berdasarkan kolom yang dikelompokkan, BigQuery hanya memindai blok yang relevan berdasarkan kolom yang dikelompokkan, bukan seluruh tabel atau partisi tabel. Dalam pendekatan gabungan yang menggunakan partisi tabel dan pengelompokan, pertama-tama Anda menyegmentasikan data tabel ke dalam partisi, lalu mengelompokkan data dalam setiap partisi berdasarkan kolom pengelompokan.
Saat membuat tabel yang dikelompokkan dan dipartisi, Anda dapat memperoleh pengurutan yang lebih terperinci, seperti yang ditunjukkan pada diagram berikut:
Partisi versus sharding
Sharding tabel adalah praktik menyimpan data dalam beberapa tabel, menggunakan
awalan penamaan seperti [PREFIX]_YYYYMMDD
.
Partisi direkomendasikan dibandingkan sharding tabel karena tabel berpartisi memiliki performa yang lebih baik. Dengan tabel yang di-sharding, BigQuery harus mempertahankan salinan skema dan metadata untuk setiap tabel. BigQuery mungkin juga perlu memverifikasi izin untuk setiap tabel yang dikueri. Praktik ini juga menambah overhead kueri dan memengaruhi performa kueri.
Jika sebelumnya telah membuat tabel yang di-sharding berdasarkan tanggal, Anda dapat mengonversinya menjadi tabel berpartisi berdasarkan waktu penyerapan. Untuk mengetahui informasi selengkapnya, lihat Mengonversi tabel yang di-sharding berdasarkan tanggal menjadi tabel berpartisi berdasarkan waktu penyerapan.
Dekorator partisi
Dekorasi partisi memungkinkan Anda mereferensikan partisi dalam tabel. Misalnya, Anda dapat menggunakannya untuk menulis data ke partisi tertentu.
Dekorator partisi memiliki bentuk table_name$partition_id
, di mana format
segmen partition_id
bergantung pada jenis partisi:
Jenis partisi | Format | Contoh |
---|---|---|
Per jam | yyyymmddhh |
my_table$2021071205 |
Daily | yyyymmdd |
my_table$20210712 |
Bulanan | yyyymm |
my_table$202107 |
Tahunan | yyyy |
my_table$2021 |
Rentang bilangan bulat | range_start |
my_table$40 |
Menelusuri data dalam partisi
Untuk menjelajahi data dalam partisi yang ditentukan, gunakan
perintah bq head
dengan
dekorator partisi.
Misalnya, perintah berikut mencantumkan semua kolom dalam 10 baris pertama
my_dataset.my_table
di partisi 2018-02-24
:
bq head --max_rows=10 'my_dataset.my_table$20180224'
Mengekspor data tabel
Mengekspor semua data dari tabel berpartisi sama dengan proses yang sama dengan mengekspor data dari tabel yang tidak dipartisi. Untuk mengetahui informasi selengkapnya, lihat Mengekspor data tabel.
Untuk mengekspor data dari partisi individual, gunakan perintah bq extract
dan
tambahkan dekorator partisi ke
nama tabel. Contoh, my_table$20160201
. Anda juga dapat mengekspor data dari
partisi __NULL__
dan __UNPARTITIONED__
dengan menambahkan nama partisi ke nama tabel. Misalnya,
my_table$__NULL__
atau my_table$__UNPARTITIONED__
.
Batasan
Anda tidak dapat menggunakan SQL lama untuk meng-kueri tabel berpartisi atau menulis hasil kueri ke tabel berpartisi.
BigQuery tidak mendukung partisi menggunakan banyak kolom. Hanya satu kolom yang dapat digunakan untuk mempartisi tabel.
Tabel berpartisi berdasarkan kolom unit waktu tunduk pada batasan berikut:
- Kolom partisi harus berupa kolom skalar
DATE
,TIMESTAMP
, atauDATETIME
. Meskipun mode kolom dapat berupaREQUIRED
atauNULLABLE
, mode ini tidak bolehREPEATED
(berbasis array). - Kolom partisi harus berupa kolom tingkat teratas. Anda tidak dapat menggunakan kolom daun
dari
RECORD
(STRUCT
) sebagai kolom partisi.
Untuk informasi tentang tabel berpartisi berdasarkan kolom satuan waktu, lihat Membuat tabel berpartisi berdasarkan kolom satuan waktu.
Tabel berpartisi berdasarkan rentang bilangan bulat tunduk pada batasan berikut:
- Kolom partisi harus berupa kolom
INTEGER
. Meskipun mode kolom dapat berupaREQUIRED
atauNULLABLE
, mode tersebut tidak bolehREPEATED
(berbasis array). - Kolom partisi harus berupa kolom tingkat teratas. Anda tidak dapat menggunakan kolom daun
dari
RECORD
(STRUCT
) sebagai kolom partisi.
Untuk informasi tentang tabel berpartisi berdasarkan rentang bilangan bulat, lihat Membuat tabel berpartisi berdasarkan rentang bilangan bulat.
Kuota dan batas
Tabel berpartisi memiliki batas yang telah ditentukan di BigQuery.
Kuota dan batas juga berlaku untuk berbagai jenis tugas yang dapat Anda jalankan terhadap tabel berpartisi, termasuk:
- Memuat data (tugas pemuatan)
- Mengekspor data (tugas mengekspor)
- Meng-kueri data (tugas kueri)
- Menyalin tabel (tugas menyalin)
Untuk mengetahui informasi selengkapnya tentang semua kuota dan batas, lihat Kuota dan batas.
Harga tabel
Saat membuat dan menggunakan tabel berpartisi di BigQuery, biaya yang ditagih kepada Anda ditentukan berdasarkan jumlah data yang disimpan dalam partisi dan di kueri yang Anda jalankan terhadap data tersebut:
- Untuk mengetahui informasi tentang harga penyimpanan, lihat Harga penyimpanan.
- Untuk mengetahui informasi tentang harga kueri, lihat Harga kueri.
Banyak operasi tabel berpartisi tersedia gratis, termasuk memuat data ke dalam partisi, menyalin partisi, dan mengekspor data dari partisi. Meskipun gratis, operasi ini tunduk pada Kuota dan batas BigQuery. Untuk mengetahui informasi tentang semua operasi gratis, lihat Operasi gratis di halaman harga.
Untuk praktik terbaik terkait mengontrol biaya di BigQuery, lihat Mengontrol biaya di BigQuery
Keamanan tabel
Kontrol akses untuk tabel berpartisi sama dengan kontrol akses untuk tabel standar. Untuk mengetahui informasi selengkapnya, lihat Pengantar kontrol akses tabel.
Langkah berikutnya
- Untuk mempelajari cara membuat tabel berpartisi, lihat Membuat tabel berpartisi.
- Untuk mempelajari cara mengelola dan memperbarui tabel berpartisi, lihat Mengelola tabel berpartisi.
- Untuk mengetahui informasi tentang cara membuat kueri tabel berpartisi, lihat Membuat kueri tabel berpartisi.