Halaman ini menjelaskan cara melakukan operasi baca 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 menjalankan operasi baca sebagai bagian dari transaksi baca-tulis. Untuk informasi selengkapnya, lihat transaksi baca-tulis.
Jika Anda melakukan beberapa panggilan baca yang memerlukan tampilan data yang konsisten, Anda harus menjalankan operasi baca sebagai bagian dari transaksi hanya baca. Untuk informasi selengkapnya, lihat transaksi hanya baca.
Jenis baca
Spanner memungkinkan Anda menentukan seberapa aktual data saat Anda membaca data dengan menawarkan dua jenis pembacaan:
- Pembacaan yang andal adalah pembacaan pada stempel waktu saat ini dan dijamin akan melihat semua data yang telah di-commit hingga awal pembacaan ini. Spanner secara default menggunakan pembacaan yang kuat untuk melayani permintaan baca.
- Pembacaan yang sudah tidak berlaku dibaca pada stempel waktu di masa lalu. Jika aplikasi Anda sensitif terhadap latensi, tetapi toleran terhadap data yang sudah tidak berlaku, pembacaan yang sudah tidak berlaku dapat memberikan manfaat performa.
Untuk memilih jenis operasi baca 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 batas stempel waktu default untuk pembacaan Spanner, termasuk transaksi hanya baca. Operasi baca yang kuat dijamin akan mengamati efek dari semua transaksi yang dilakukan sebelum awal operasi, terlepas dari replika mana yang menerima operasi baca. Oleh karena itu, pembacaan yang kuat membuat kode aplikasi lebih sederhana dan aplikasi lebih tepercaya. Baca selengkapnya tentang properti konsistensi Spanner di TrueTime dan Konsistensi Eksternal.
Jika latensi membuat pembacaan yang kuat tidak dapat dilakukan dalam beberapa situasi, gunakan pembacaan yang sudah tidak berlaku (ketidakaktualitas terbatas atau ketiadaktuaktualitas persis) untuk meningkatkan performa di tempat yang tidak memerlukan pembacaan yang seaktual mungkin. Seperti yang dijelaskan di halaman Replikasi, 15 detik adalah nilai tidak berlaku yang wajar untuk digunakan guna mendapatkan performa yang baik.
Membaca data dengan peran database
Jika Anda adalah pengguna kontrol akses terperinci, Anda harus memilih peran database untuk mengeksekusi pernyataan dan kueri SQL, serta untuk melakukan operasi baris di database. Pilihan peran Anda akan tetap ada selama sesi hingga Anda mengubah peran.
Untuk mengetahui petunjuk tentang cara melakukan operasi baca dengan peran database, lihat Mengakses database dengan kontrol akses terperinci.
Metode baca tunggal
Spanner mendukung metode baca tunggal (yaitu, baca di luar konteks transaksi) di database untuk:
- Menjalankan operasi baca sebagai pernyataan kueri SQL atau menggunakan read API Spanner.
- Melakukan pembacaan yang kuat dari satu baris atau beberapa baris dalam tabel.
- Melakukan pembacaan yang sudah tidak berlaku dari satu baris atau beberapa baris dalam tabel.
- Membaca dari satu baris atau beberapa baris dalam indeks sekunder.
Jika Anda ingin merutekan operasi baca tunggal ke replika atau region tertentu dalam konfigurasi instance multi-region atau konfigurasi regional kustom dengan region hanya baca opsional, lihat Operasi baca terarah.
Bagian berikut menjelaskan cara menggunakan metode baca menggunakan library klien Spanner.
Menjalankan kueri
Berikut ini cara mengeksekusi pernyataan kueri SQL terhadap database.
GoogleSQL
C++
Gunakan ExecuteQuery()
untuk mengeksekusi 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 dan Fungsi dan Operator SQL saat membuat pernyataan SQL.
Melakukan pembacaan yang kuat
Berikut ini cara melakukan pembacaan kuat dari nol atau beberapa baris dari database.
GoogleSQL
C++
Kode untuk membaca data sama dengan contoh sebelumnya untuk membuat kueri Spanner dengan menjalankan kueri SQL.
C#
Kode untuk membaca data sama dengan contoh sebelumnya untuk membuat kueri Spanner dengan menjalankan 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 tidak berlaku
Contoh kode berikut menunjukkan cara melakukan pembacaan yang sudah tidak berlaku dari nol atau beberapa baris dari database menggunakan batas stempel waktu exact-staleness. 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 mengetahui 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 operasi baca baris dari database menggunakan batas stempel waktu keusangan yang tepat.
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 batas stempel waktu keusangan yang tepat.
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 batas stempel waktu keusangan yang tepat.
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 keusangan yang tepat.
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 ditentukan untuk melakukan pembacaan baris dari database menggunakan batasan stempel waktu keusangan yang tepat.
Contoh ini menggunakan KeySet
untuk menentukan kumpulan kunci atau rentang kunci yang akan dibaca.
Ruby
Gunakan metode read
dari snapshot Client
yang memiliki nilai staleness
yang ditentukan (dalam detik) untuk melakukan pembacaan baris dari database menggunakan batas stempel waktu keusangan yang tepat.
Melakukan operasi baca menggunakan indeks
Berikut ini cara membaca nol atau beberapa baris dari database menggunakan indeks:
GoogleSQL
C++
Gunakan fungsi Read()
untuk melakukan operasi baca menggunakan indeks.
C#
Baca data menggunakan indeks dengan menjalankan 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 operasi baca massal yang melibatkan data dalam jumlah sangat besar dari Spanner, Anda dapat menggunakan PartitionQuery
API untuk mendapatkan hasil yang lebih cepat. API membagi kueri menjadi batch, atau partisi, dengan menggunakan beberapa mesin untuk mengambil partisi secara paralel. Perhatikan bahwa penggunaan PartitionQuery
API menyebabkan latensi yang lebih tinggi karena hanya ditujukan untuk operasi massal seperti mengekspor atau memindai seluruh database.
Anda dapat melakukan operasi API baca secara paralel menggunakan library klien Spanner. Namun, Anda hanya dapat mempartisi kueri SQL jika kueri dapat dipartisi root. Agar kueri dapat dipartisi root, rencana kueri harus memenuhi salah satu kondisi berikut:
Operator pertama dalam rencana eksekusi kueri adalah union terdistribusi dan rencana eksekusi kueri hanya berisi satu union terdistribusi (tidak termasuk Union Distribusi Lokal). Rencana kueri Anda tidak boleh berisi operator terdistribusi lainnya, seperti cross apply terdistribusi.
Tidak ada operator terdistribusi dalam rencana 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 dapat mendapatkan rencana eksekusi kueri
yang digunakan oleh PartitionQuery
API di Spanner Studio.
Untuk kueri yang dipartisi seperti ini, Anda dapat memilih untuk mengaktifkan Spanner Data Boost. Data Boost memungkinkan Anda menjalankan kueri analisis besar dengan dampak yang hampir tidak ada ke workload 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 di 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 di 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 di 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 di setiap partisi melalui langkah-langkah berikut:
- Membuat klien batch Spanner dan transaksi.
- 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 di 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 di 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 di 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 di 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.