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:

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 nilai NULL 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 batas 4.000 partisi per tabel saat menggunakan tingkat perincian waktu yang lebih terperinci, gunakan tingkat perincian 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:

Membandingkan tabel yang tidak dikelompokkan atau berpartisi dengan tabel yang dikelompokkan dan berpartisi.

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_tablee$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, atau DATETIME. Meskipun mode kolom dapat berupa REQUIRED atau NULLABLE, mode ini tidak boleh REPEATED (berbasis array).‏
  • Kolom partisi harus berupa kolom tingkat atas. Anda tidak dapat menggunakan kolom leaf 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 berupa REQUIRED atau NULLABLE, mode tersebut tidak boleh REPEATED (berbasis array).
  • Kolom partisi harus berupa kolom tingkat atas. Anda tidak dapat menggunakan kolom leaf 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:

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 selanjutnya