Operasi baca

Halaman ini menjelaskan jenis permintaan baca yang dapat Anda kirim ke BigQuery , membahas implikasi performa, dan menyajikan beberapa rekomendasi untuk jenis kueri tertentu. Sebelum membaca halaman ini, Anda harus sudah memahami ringkasan Bigtable.

Ringkasan

Permintaan baca ke Bigtable menampilkan konten baris yang diminta sesuai urutan kunci. Artinya, baris tersebut ditampilkan sesuai urutan penyimpanannya. Anda dapat membaca setiap penulisan yang telah menampilkan respons.

Kueri yang didukung tabel Anda akan membantu menentukan jenis pembacaan yang terbaik untuk kasus penggunaan Anda. Permintaan baca Bigtable dibagi ke dalam dua kategori umum:

  • Membaca satu baris
  • Memindai, atau membaca beberapa baris

Operasi baca bersifat atomik di tingkat baris. Artinya, saat Anda mengirim permintaan baca untuk sebuah baris, Bigtable akan menampilkan seluruh baris atau, jika permintaan gagal, maka tidak satu pun baris tersebut. Baris parsial tidak pernah ditampilkan kecuali jika Anda secara khusus memintanya.

Kami sangat menyarankan Anda menggunakan library klien Cloud Bigtable untuk membaca data dari tabel, bukan memanggil API secara langsung. Contoh kode yang menunjukkan cara mengirim permintaan baca tersedia dalam beberapa bahasa. Semua permintaan baca akan melakukan panggilan API ReadRows.

Membaca data dengan komputasi serverless Data Boost

Dengan Bigtable Data Boost, Anda dapat menjalankan tugas dan kueri pembacaan batch tanpa memengaruhi traffic aplikasi harian. Data Boost adalah layanan komputasi serverless yang dapat Anda gunakan untuk membaca data Bigtable saat aplikasi inti menggunakan node cluster untuk komputasi.

Data Boost ideal untuk pemindaian dan tidak direkomendasikan untuk pembacaan baris tunggal. Anda tidak dapat menggunakan Data Boost untuk pemindaian terbalik. Untuk mengetahui informasi selengkapnya dan kriteria kelayakan, lihat ringkasan Data Boost.

Pembacaan baris tunggal

Anda dapat meminta satu baris berdasarkan row key. Pembacaan baris tunggal, yang juga dikenal sebagai pembacaan titik, tidak kompatibel dengan Data Boost. Contoh kode tersedia untuk variasi berikut:

Pemindaian

Pemindaian adalah cara paling umum untuk membaca data Bigtable. Anda dapat membaca berbagai baris yang berdekatan atau beberapa rentang baris dari Bigtable, dengan menentukan awalan kunci baris atau menentukan kunci baris awal dan akhir. Contoh kode tersedia untuk variasi berikut:

Pemindaian terbalik

Pemindaian terbalik memungkinkan Anda membaca rentang baris secara mundur, baik dengan menentukan awalan kunci baris atau rentang baris. Awalan kunci baris digunakan sebagai titik inisiasi pemindaian untuk membaca mundur. Jika Anda menentukan rentang baris, tombol baris akhir akan digunakan sebagai titik awal pemindaian.

Memindai dalam urutan terbalik dapat berguna untuk skenario berikut:

Pemindaian terbalik kurang efisien dibandingkan dengan pemindaian maju. Secara umum, desain kunci baris Anda sehingga sebagian besar pemindaian bersifat maju. Gunakan pemindaian terbalik untuk pemindaian singkat, seperti 50 baris atau kurang, untuk mempertahankan waktu respons latensi rendah.

Untuk memindai secara terbalik, Anda menetapkan nilai untuk kolom ReadRowsRequest reversed ke benar (true). Secara default, nilainya adalah false.

Pemindaian balik tersedia saat Anda menggunakan library klien berikut:

  • Library klien Bigtable untuk C++ versi 2.18.0 atau yang lebih baru
  • Library klien Bigtable untuk Go versi 1.21.0 atau yang lebih baru
  • Library klien Bigtable untuk Java versi 2.24.1 atau yang lebih baru
  • Klien Bigtable HBase untuk Java versi 2.10.0 atau yang lebih baru

Untuk contoh kode yang menunjukkan cara menggunakan pemindaian terbalik, lihat Memindai secara terbalik.

Contoh kasus penggunaan

Contoh berikut menunjukkan cara penggunaan pemindaian terbalik untuk mengetahui kapan terakhir kali pelanggan mengubah sandi dan fluktuasi harga suatu produk pada hari tertentu.

Mereset sandi

Pertimbangkan asumsi bahwa masing-masing kunci baris berisi ID pelanggan dan tanggal, dalam format 123ABC#2022-05-02, dan salah satu kolomnya adalah password_reset, yang menyimpan jam saat sandi direset. Bigtable secara otomatis menyimpan data secara leksikografis, seperti berikut. Perhatikan bahwa kolom tidak ada untuk baris (hari) saat sandi tidak direset.

`123ABC#2022-02-12,password_reset:03`
`123ABC#2022-04-02,password_reset:11`
`123ABC#2022-04-14`
`123ABC#2022-05-02`
`223ABC#2022-05-22`

Jika ingin menemukan kapan terakhir kali pelanggan 123ABC mereset sandinya, Anda dapat memindai rentang 123ABC# hingga 123ABC#<DATE> secara terbalik, menggunakan tanggal hari ini atau tanggal di masa mendatang, untuk semua baris yang berisi kolom password_reset dengan batas baris 1.

Perubahan harga

Dalam contoh ini, kunci baris Anda berisi nilai untuk produk, model, dan stempel waktu, dan salah satu kolom berisi harga untuk produk dan model pada waktu tertentu.

`productA#model2#1675604471,price:82.63`
`productA#model2#1676219411,price:82.97`
`productA#model2#1677681011,price:83.15`
`productA#model2#1680786011,price:83.99`
`productA#model2#1682452238,price:83.12`

Jika Anda ingin menemukan fluktuasi harga seputar harga pada 14 Februari 2023, meskipun kunci baris untuk tanggal tersebut tidak ada di tabel, Anda dapat melakukan pemindaian maju mulai dari kunci baris productA#model2#1676376000 untuk N jumlah baris, lalu lakukan pemindaian terbalik untuk jumlah baris yang sama dari baris awal yang sama. Kedua pemindaian memberi Anda harga sebelum dan sesudah waktu tertentu.

Bacaan yang difilter

Jika hanya memerlukan baris yang berisi nilai tertentu, atau baris sebagian, Anda dapat menggunakan filter dengan permintaan baca. Filter memungkinkan Anda untuk sangat selektif dalam data yang Anda inginkan.

Filter juga memungkinkan Anda memastikan bahwa pembacaan sesuai dengan kebijakan pembersihan sampah memori yang digunakan tabel Anda. Hal ini sangat berguna jika Anda sering menulis sel dengan stempel waktu baru ke kolom yang ada. Karena pembersihan sampah memori memerlukan waktu hingga satu minggu untuk menghapus data yang telah habis masa berlakunya, menggunakan filter rentang stempel waktu untuk membaca data dapat memastikan Anda tidak membaca lebih banyak data daripada yang dibutuhkan.

Ringkasan filter memberikan penjelasan mendetail tentang jenis filter yang dapat Anda gunakan. Penggunaan filter akan menampilkan contoh dalam berbagai bahasa.

Membaca data dari tampilan yang diizinkan

Untuk membaca data dari tampilan yang diizinkan, Anda harus menggunakan salah satu dari hal berikut:

  • gcloud CLI
  • Klien Bigtable untuk Java

Library klien Bigtable lainnya belum mendukung akses tampilan.

Semua metode yang memanggil metode ReadRows atau SampleRowKeys dari BigQuery Data API didukung. Anda memberikan ID tampilan yang diotorisasi selain ID tabel saat membuat klien.

Operasi baca dan performa

Operasi baca yang menggunakan filter lebih lambat dibandingkan operasi baca tanpa filter, dan dapat meningkatkan penggunaan CPU. Di sisi lain, solusi ini dapat secara signifikan mengurangi jumlah bandwidth jaringan yang Anda gunakan, dengan membatasi jumlah data yang ditampilkan. Secara umum, filter harus digunakan untuk mengontrol efisiensi throughput, bukan latensi.

Jika Anda ingin mengoptimalkan performa baca, pertimbangkan strategi berikut:

  1. Batasi baris set sebanyak mungkin. Membatasi jumlah baris yang harus dipindai node Anda adalah langkah pertama untuk mempersingkat waktu ke byte pertama dan keseluruhan latensi kueri. Jika Anda tidak membatasi barisan, {i> Bigtable<i} hampir dipastikan harus memindai seluruh tabel Anda. Inilah alasan kami menyarankan Anda untuk mendesain skema sedemikian rupa sehingga kueri yang paling umum dapat berfungsi dengan cara ini.

  2. Untuk penyesuaian performa tambahan setelah Anda membatasi rowset, coba tambahkan filter dasar. Membatasi kumpulan kolom atau jumlah versi yang ditampilkan umumnya tidak meningkatkan latensi dan terkadang dapat membantu Bigtable mencari data yang tidak relevan di setiap baris secara lebih efisien.

  3. Jika Anda ingin lebih meningkatkan performa baca setelah dua strategi pertama, pertimbangkan untuk menggunakan filter yang lebih rumit. Anda dapat mencobanya karena beberapa alasan berikut:

    • Anda masih mendapatkan kembali banyak data yang tidak Anda inginkan.
    • Anda ingin menyederhanakan kode aplikasi dengan menekan kueri ke BigQuery.

    Namun, perlu diketahui bahwa filter yang memerlukan kondisi, sisipan, atau pencocokan ekspresi reguler pada nilai yang besar cenderung lebih membahayakan daripada baik jika filter tersebut mengizinkan sebagian besar data yang dipindai. Kerugian ini berupa peningkatan penggunaan CPU di cluster Anda tanpa penghematan besar di sisi klien.

Selain strategi tersebut, hindari membaca sejumlah besar tombol baris yang tidak berdekatan atau rentang baris dalam satu permintaan baca. Saat Anda meminta ratusan kunci baris atau rentang baris dalam satu permintaan, Bigtable akan memindai tabel dan membaca baris yang diminta secara berurutan. Tidak adanya paralelisme ini memengaruhi latensi keseluruhan, dan setiap bacaan yang mencapai node panas dapat meningkatkan latensi tail. Semakin banyak rentang baris yang diminta, semakin lama waktu yang dibutuhkan untuk menyelesaikan pembacaan. Jika latensi ini tidak dapat diterima, sebaiknya Anda mengirim beberapa permintaan serentak yang masing-masing mengambil rentang baris yang lebih sedikit.

Secara umum, membaca lebih banyak rentang baris dalam satu permintaan akan mengoptimalkan throughput, tetapi bukan latensi. Membaca lebih sedikit rentang baris dalam beberapa permintaan serentak akan mengoptimalkan latensi, tetapi tidak throughput. Menemukan keseimbangan yang tepat antara latensi dan throughput akan bergantung pada persyaratan aplikasi Anda, dan dapat dimulai dengan menyesuaikan jumlah permintaan baca serentak dan jumlah rentang baris dalam satu permintaan.

Baris besar

Bigtable membatasi ukuran baris hingga 256 MB, tetapi dapat saja melebihi batas maksimum tersebut secara tidak sengaja. Jika perlu membaca baris yang telah melebihi batas, Anda dapat memberi nomor halaman pada permintaan dan menggunakan filter cells per row limit dan filter cells per row offset. Perlu diketahui bahwa jika operasi tulis masuk ke baris di antara permintaan baca yang diberi nomor halaman, operasi baca mungkin tidak bersifat atomik.

Langkah selanjutnya