Halaman ini menjelaskan cara melakukan pembacaan di Spanner di luar konteks transaksi hanya baca dan baca-tulis. Jika salah satu hal berikut berlaku, Anda harus membaca halaman Transaksi:
Jika perlu menulis, bergantung pada nilai satu atau beberapa operasi baca, Anda harus mengeksekusi pembacaan sebagai bagian dari transaksi baca-tulis. Untuk mengetahui informasi selengkapnya, lihat transaksi baca-tulis.
Jika melakukan beberapa panggilan baca yang memerlukan tampilan data yang konsisten, Anda harus mengeksekusi pembacaan sebagai bagian dari transaksi hanya baca. Untuk informasi selengkapnya, lihat transaksi hanya baca.
Membaca jenis
Spanner memungkinkan Anda menentukan seberapa aktual data saat membaca data dengan menawarkan dua jenis operasi baca:
- Pembacaan kuat adalah pembacaan pada stempel waktu saat ini dan dijamin untuk melihat semua data yang telah di-commit hingga awal pembacaan ini. Secara default, Spanner menggunakan pembacaan yang kuat untuk menyalurkan permintaan baca.
- Pembacaan yang sudah tidak berlaku dibaca pada stempel waktu yang lalu. Jika aplikasi Anda sensitif terhadap latensi tetapi toleran terhadap data tidak berlaku, pembacaan yang sudah tidak berlaku dapat memberikan manfaat bagi performa.
Untuk memilih jenis pembacaan yang Anda inginkan, tetapkan batas stempel waktu pada permintaan baca. Gunakan praktik terbaik berikut saat memilih batas stempel waktu:
Pilih pembacaan yang kuat jika memungkinkan. Ini adalah stempel waktu default yang terikat untuk pembacaan Spanner, termasuk transaksi hanya baca. Bacaan yang kuat dijamin mengamati efek dari semua transaksi yang dilakukan sebelum dimulainya operasi, terlepas dari replika mana yang menerima bacaan. Oleh karena itu, pembacaan yang kuat membuat kode aplikasi lebih sederhana dan aplikasi lebih tepercaya. Baca selengkapnya tentang properti konsistensi Spanner di TrueTime dan External Consistency.
Jika latensi membuat pembacaan yang kuat tidak mungkin dilakukan dalam beberapa situasi, gunakan operasi baca yang sudah tidak berlaku (keadaan terikat atau ketinggalan zaman) untuk meningkatkan performa saat Anda tidak memerlukan pembacaan versi terbaru. Seperti yang dijelaskan di halaman Replikasi, 15 detik adalah nilai penghentian yang wajar untuk digunakan demi performa yang baik.
Membaca data dengan peran database
Jika Anda adalah pengguna kontrol akses yang mendetail, Anda harus memilih peran database untuk menjalankan pernyataan dan kueri SQL, serta melakukan operasi baris pada database. Pilihan peran tetap ada sepanjang sesi Anda sampai Anda mengubah peran.
Untuk mengetahui petunjuk cara melakukan pembacaan dengan peran database, lihat Mengakses database dengan kontrol akses yang sangat terperinci.
Metode baca tunggal
Spanner mendukung metode baca tunggal (yaitu, pembacaan di luar konteks transaksi) pada database untuk:
- Mengeksekusi pembacaan sebagai pernyataan kueri SQL atau menggunakan API baca Spanner.
- Melakukan pembacaan yang kuat dari satu baris atau beberapa baris dalam tabel.
- Melakukan pembacaan yang sudah tidak berlaku dari satu atau beberapa baris dalam tabel.
- Membaca dari satu atau beberapa baris dalam indeks sekunder.
Jika Anda ingin merutekan pembacaan tunggal ke replika atau region tertentu dalam konfigurasi instance multi-region atau konfigurasi regional kustom dengan region hanya baca opsional, lihat Pembacaan yang diarahkan.
Bagian berikut menjelaskan cara menggunakan metode baca dengan library klien Spanner.
Menjalankan kueri
Berikut ini cara mengeksekusi pernyataan kueri SQL terhadap database.
GoogleSQL
C++
Gunakan ExecuteQuery()
untuk menjalankan pernyataan kueri SQL terhadap database.
C#
Gunakan ExecuteReaderAsync()
untuk membuat kueri database.
Go
Gunakan Client.Single().Query
untuk membuat kueri database.
Java
Gunakan ReadContext.executeQuery
untuk membuat kueri database.
Node.js
Gunakan Database.run
untuk membuat kueri database.
PHP
Gunakan Database::execute
untuk membuat kueri database.
Python
Gunakan Database.execute_sql
untuk membuat kueri database.
Ruby
Gunakan Client#execute
untuk membuat kueri database.
Lihat referensi Sintaksis Kueri serta Fungsi dan Operator SQL saat membuat pernyataan SQL.
Lakukan pembacaan yang kuat
Berikut ini cara melakukan pembacaan yang kuat terhadap nol atau beberapa baris dari suatu database.
GoogleSQL
C++
Kode untuk membaca data sama dengan contoh sebelumnya untuk membuat kueri Spanner dengan mengeksekusi kueri SQL.
C#
Kode untuk membaca data sama dengan contoh sebelumnya untuk membuat kueri Spanner dengan mengeksekusi kueri SQL.
Go
Gunakan Client.Single().Read
untuk membaca baris dari database.
Contoh ini menggunakan AllKeys
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Java
Gunakan ReadContext.read
untuk membaca baris dari database.
Contoh ini menggunakan KeySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Node.js
Gunakan Table.read
untuk membaca baris dari database.
Contoh ini menggunakan keySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
PHP
Gunakan Database::read
untuk membaca baris dari database.
Contoh ini menggunakan keySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Python
Gunakan Database.read
untuk membaca baris dari database.
Contoh ini menggunakan KeySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Ruby
Gunakan Client#read
untuk membaca baris dari database.
Melakukan pembacaan yang sudah tidak berlaku
Kode contoh berikut menunjukkan cara melakukan pembacaan yang sudah tidak berlaku terhadap nol atau beberapa baris dari database menggunakan batas stempel waktu persis-slateness. Untuk petunjuk cara melakukan pembacaan yang sudah tidak berlaku menggunakan batas stempel waktu bounded-staleness, lihat catatan setelah kode contoh. Lihat Batas stempel waktu untuk informasi selengkapnya tentang berbagai jenis batas stempel waktu yang tersedia.
GoogleSQL
C++
Gunakan ExecuteQuery()
dengan MakeReadOnlyTransaction()
dan Transaction::ReadOnlyOptions()
untuk melakukan pembacaan yang sudah tidak berlaku.
C#
Gunakan metode BeginReadOnlyTransactionAsync
pada connection
dengan nilai TimestampBound.OfExactStaleness()
yang ditentukan untuk membuat kueri database.
Go
Gunakan Client.ReadOnlyTransaction().WithTimestampBound()
dan tentukan
nilai ExactStaleness
untuk melakukan pembacaan baris dari database menggunakan
batasan stempel waktu yang persis sama.
Contoh ini menggunakan AllKeys
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Java
Gunakan metode read
dari ReadContext
yang memiliki
TimestampBound.ofExactStaleness()
yang ditentukan untuk melakukan pembacaan baris dari
database menggunakan terikat stempel waktu masa berlaku yang sama persis.
Contoh ini menggunakan KeySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Node.js
Gunakan Table.read
dengan opsi exactStaleness
untuk melakukan pembacaan baris
dari database menggunakan terikat stempel waktu masa berlaku yang sama persis.
Contoh ini menggunakan keySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
PHP
Gunakan Database::read
dengan nilai exactStaleness
yang ditentukan untuk melakukan
pembacaan baris dari database menggunakan batas stempel waktu yang sama persis.
Contoh ini menggunakan keySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Python
Gunakan metode read
dari Database
snapshot
yang memiliki nilai
exact_staleness
yang telah ditentukan untuk melakukan pembacaan baris dari database menggunakan
batasan stempel waktu masa berlaku yang tepat.
Contoh ini menggunakan KeySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Ruby
Gunakan metode read
dari Client
snapshot yang memiliki nilai staleness
yang ditentukan (dalam detik) untuk melakukan pembacaan baris dari database
menggunakan batas stempel waktu masa berlaku yang tepat.
Melakukan pembacaan menggunakan indeks
Berikut cara membaca nol atau beberapa baris dari database menggunakan indeks:
GoogleSQL
C++
Gunakan fungsi Read()
untuk melakukan pembacaan menggunakan indeks.
C#
Baca data menggunakan indeks dengan mengeksekusi kueri yang secara eksplisit menentukan indeks:
Go
Gunakan Client.Single().ReadUsingIndex
untuk membaca baris dari database menggunakan indeks.
Java
Gunakan ReadContext.readUsingIndex
untuk membaca baris dari database menggunakan indeks.
Node.js
Gunakan Table.read
dan tentukan indeks dalam kueri untuk membaca baris dari database menggunakan indeks.
PHP
Gunakan Database::read
dan tentukan indeks untuk membaca baris dari database menggunakan indeks.
Python
Gunakan Database.read
dan tentukan indeks untuk membaca baris dari database menggunakan indeks.
Ruby
Gunakan Client#read
dan tentukan indeks untuk membaca baris dari database menggunakan indeks.
Membaca data secara paralel
Saat melakukan operasi kueri atau baca massal yang melibatkan data dalam jumlah yang sangat besar dari Spanner, Anda dapat menggunakan PartitionQuery
API untuk mendapatkan hasil yang lebih cepat. API membagi kueri menjadi beberapa batch, atau
partisi, dengan menggunakan beberapa mesin untuk mengambil partisi secara paralel. Perlu
diingat bahwa penggunaan PartitionQuery
API akan menyebabkan latensi yang lebih tinggi karena
hanya ditujukan untuk operasi massal seperti mengekspor atau memindai seluruh
database.
Anda dapat menjalankan operasi API baca apa pun secara paralel menggunakan library klien Spanner. Namun, Anda hanya dapat mempartisi kueri SQL jika kueri dapat dipartisi di root. Agar kueri dapat dipartisi di root, paket kueri harus memenuhi salah satu kondisi berikut:
Operator pertama dalam rencana eksekusi kueri adalah gabungan terdistribusi dan rencana eksekusi kueri hanya berisi satu gabungan terdistribusi (tidak termasuk Local Distribution Union). Paket kueri Anda tidak dapat berisi operator terdistribusi lainnya, seperti penerapan silang terdistribusi.
Tidak ada operator terdistribusi dalam paket kueri.
PartitionQuery
API menjalankan kueri dalam mode batch. Spanner
dapat memilih rencana eksekusi kueri yang membuat kueri dapat dipartisi root
saat dijalankan dalam mode batch. Akibatnya, PartitionQuery
API dan
Spanner Studio mungkin menggunakan rencana eksekusi kueri yang berbeda
untuk kueri yang sama. Anda mungkin tidak bisa mendapatkan rencana eksekusi kueri yang digunakan oleh PartitionQuery
API di Spanner Studio.
Untuk kueri terpartisi seperti ini, Anda dapat memilih untuk mengaktifkan Spanner Data Boost. Dengan Data Boost, Anda dapat menjalankan kueri analisis besar dengan dampak nyaris nol terhadap beban kerja yang ada di instance Spanner yang disediakan. Contoh kode C++, Go, Java, Node.js, dan Python di halaman ini menunjukkan cara mengaktifkan Data Boost.
Untuk mengetahui informasi selengkapnya tentang Data Boost, lihat Ringkasan Data Boost.
GoogleSQL
C++
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat transaksi batch Spanner.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.
C#
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat transaksi batch Spanner.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.
Go
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat klien Spanner dan transaksi.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.
Java
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat klien batch dan transaksi Spanner.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.
Node.js
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat klien Spanner dan batch.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.
PHP
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat klien Spanner dan batch.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.
Python
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat klien Spanner dan transaksi batch.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.
Ruby
Contoh ini mengambil partisi kueri SQL dari tabel Singers
dan mengeksekusi kueri pada setiap partisi melalui langkah-langkah berikut:
- Membuat klien batch Spanner.
- Membuat partisi untuk kueri, sehingga partisi dapat didistribusikan ke beberapa pekerja.
- Mengambil hasil kueri untuk setiap partisi.