Saat Anda menggunakan kueri SQL untuk mencari data, Spanner secara otomatis menggunakan indeks sekunder yang mungkin dapat membantu mengambil data dengan lebih efisien. Namun, dalam beberapa kasus, Spanner mungkin memilih indeks yang menyebabkan kueri menjadi lebih lambat. Akibatnya, ada beberapa kueri yang berjalan lebih lambat dibandingkan sebelumnya.
Halaman ini menjelaskan cara mendeteksi perubahan kecepatan eksekusi kueri; memeriksa rencana eksekusi kueri untuk kueri tersebut; dan menentukan indeks yang berbeda untuk kueri mendatang jika diperlukan.
Mendeteksi perubahan pada kecepatan eksekusi kueri
Kemungkinan besar Anda akan melihat perubahan pada kecepatan eksekusi kueri setelah melakukan salah satu perubahan ini:
- Mengubah secara signifikan sejumlah besar data yang ada yang memiliki indeks sekunder.
- Menambahkan, mengubah, atau melepaskan indeks sekunder.
Anda dapat menggunakan beberapa alat yang berbeda untuk mengidentifikasi kueri tertentu yang dieksekusi Spanner lebih lambat dari biasanya:
- Insight kueri dan Statistik kueri.
Metrik khusus aplikasi yang Anda ambil dan analisis dengan Cloud Monitoring. Misalnya, Anda dapat memantau metrik Jumlah kueri untuk menentukan jumlah kueri dalam instance dari waktu ke waktu dan mencari tahu versi pengoptimal kueri yang digunakan untuk menjalankan kueri.
Alat pemantauan sisi klien yang mengukur performa aplikasi Anda.
Catatan tentang {i>database<i} baru
Ketika membuat kueri database yang baru dibuat dengan data yang baru disisipkan atau diimpor, Spanner mungkin tidak memilih indeks yang paling sesuai, karena pengoptimal kueri memerlukan waktu hingga tiga hari untuk mengumpulkan statistik pengoptimal secara otomatis. Untuk mengoptimalkan penggunaan indeks database Spanner baru lebih cepat dari tersebut, Anda dapat membuat paket statistik baru secara manual.
Meninjau skema
Setelah Anda menemukan kueri yang melambat, lihat pernyataan SQL untuk kueri tersebut, lalu identifikasi tabel yang digunakan pernyataan tersebut dan kolom yang diambil dari tabel tersebut.
Selanjutnya, temukan indeks sekunder yang ada untuk tabel tersebut. Tentukan apakah ada indeks yang menyertakan kolom yang Anda kueri. Artinya, Spanner mungkin akan menggunakan salah satu indeks untuk memproses kueri.
- Jika ada indeks yang berlaku, langkah berikutnya adalah menemukan indeks yang digunakan Spanner untuk kueri.
Jika tidak ada indeks yang berlaku, gunakan perintah
gcloud spanner operations list
untuk memeriksa apakah Anda baru saja menghapus indeks yang berlaku:gcloud spanner operations list \ --instance=INSTANCE \ --database=DATABASE \ --filter="@TYPE:UpdateDatabaseDdlMetadata"
Jika Anda menghapus indeks yang berlaku, perubahan tersebut mungkin memengaruhi performa kueri. Tambahkan kembali indeks sekunder ke tabel. Setelah Spanner menambahkan indeks, jalankan lagi kueri dan lihat performanya. Jika performa tidak meningkat, langkah berikutnya adalah menemukan indeks yang digunakan Spanner untuk kueri.
Jika Anda tidak melepas indeks yang berlaku, pemilihan indeks tidak menyebabkan performa kueri mengalami regresi. Cari perubahan lain pada data atau pola penggunaan yang mungkin telah memengaruhi performa.
Menemukan indeks yang digunakan untuk kueri
Untuk mengetahui indeks yang digunakan Spanner untuk memproses kueri, lihat rencana eksekusi kueri di Konsol Google Cloud:
Buka halaman Instance Spanner di Konsol Google Cloud.
Klik nama instance yang ingin dikueri.
Di panel kiri, klik database yang ingin Anda kueri, lalu klik
Spanner Studio.Masukkan kueri untuk diuji.
Di menu drop-down Jalankan kueri, pilih Hanya penjelasan. Spanner akan menampilkan paket kueri.
Cari setidaknya salah satu operator berikut dalam paket kueri:
- Pemindaian tabel
- Pemindaian indeks
- Penerapan silang atau penerapan silang terdistribusi
Bagian berikut menjelaskan arti setiap operator.
Operator pemindaian tabel
Operator pemindaian tabel menunjukkan bahwa Spanner tidak menggunakan indeks sekunder:
Misalnya, anggaplah tabel Albums
tidak memiliki indeks sekunder, dan Anda menjalankan kueri berikut:
SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
Karena tidak ada indeks yang dapat digunakan, paket kueri menyertakan operator pemindaian tabel.
Operator pemindaian indeks
Operator pemindaian indeks menunjukkan bahwa Spanner menggunakan indeks sekunder saat memproses kueri:
Misalnya, Anda menambahkan indeks ke tabel Albums
:
CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);
Kemudian Anda menjalankan kueri berikut:
SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
Indeks AlbumsByAlbumTitle
berisi AlbumTitle
, yang merupakan satu-satunya kolom
yang dipilih kueri. Akibatnya, paket kueri menyertakan operator pemindaian indeks.
Operator penerapan silang
Dalam beberapa kasus, Spanner menggunakan indeks yang hanya berisi beberapa kolom yang dipilih kueri. Akibatnya, Spanner harus menggabungkan indeks dengan tabel dasar.
Saat jenis penggabungan ini terjadi, paket kueri akan menyertakan operator lintas penerapan atau penerapan silang terdistribusi yang memiliki input berikut:
- Operator pemindaian indeks untuk indeks tabel
- Operator pemindaian tabel untuk tabel yang memiliki indeks
Misalnya, Anda menambahkan indeks ke tabel Albums
:
CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);
Kemudian Anda menjalankan kueri berikut:
SELECT * FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
Indeks AlbumsByAlbumTitle
berisi AlbumTitle
, tetapi kuerinya memilih semua
kolom dalam tabel, bukan hanya AlbumTitle
. Akibatnya, paket kueri
menyertakan operator penerapan silang terdistribusi, dengan pemindaian indeks
AlbumsByAlbumTitle
dan pemindaian tabel Albums
sebagai inputnya.
Pilih indeks lain
Setelah menemukan indeks yang digunakan Spanner untuk kueri Anda, coba jalankan kueri dengan indeks yang berbeda, atau dengan memindai tabel dasar, bukan menggunakan indeks. Untuk menentukan indeks, tambahkan perintah FORCE_INDEX
ke kueri.
Jika Anda menemukan versi kueri yang lebih cepat, update aplikasi Anda untuk menggunakan versi yang lebih cepat.
Panduan untuk memilih indeks
Gunakan panduan ini untuk menentukan indeks yang akan diuji untuk kueri:
Jika kueri Anda memenuhi salah satu kriteria ini, coba gunakan tabel dasar, bukan indeks sekunder:
- Kueri ini memeriksa kesetaraan dengan awalan kunci utama tabel dasar (misalnya,
SELECT * FROM Albums WHERE SingerId = 1
). - Sejumlah besar baris memenuhi predikat kueri (misalnya,
SELECT * FROM Albums WHERE AlbumTitle != "There Is No Album With This Title"
). - Kueri menggunakan tabel dasar yang hanya berisi beberapa ratus baris.
- Kueri ini memeriksa kesetaraan dengan awalan kunci utama tabel dasar (misalnya,
Jika kueri berisi predikat yang sangat selektif (misalnya,
REGEXP_CONTAINS
,STARTS_WITH
,<
,<=
,>
,>=
, atau!=
), coba gunakan indeks yang menyertakan kolom yang sama dengan yang Anda gunakan di predikat.
Menguji kueri yang diperbarui
Gunakan konsol Google Cloud untuk menguji kueri yang diperbarui dan cari tahu waktu yang dibutuhkan untuk memproses kueri tersebut.
Jika kueri Anda menyertakan parameter kueri, dan parameter
kueri terikat dengan beberapa nilai jauh lebih sering daripada yang lain, maka ikat parameter kueri
dengan salah satu nilai tersebut dalam pengujian Anda. Misalnya, jika
kueri menyertakan predikat seperti WHERE country = @countryId
, dan hampir semua
kueri Anda mengikat @countryId
ke nilai US
, maka ikat @countryId
ke
US
untuk pengujian performa Anda. Pendekatan ini membantu Anda mengoptimalkan
kueri yang paling sering Anda jalankan.
Untuk menguji kueri yang diperbarui di Konsol Google Cloud, ikuti langkah-langkah berikut:
Buka halaman Instance Spanner di Konsol Google Cloud.
Klik nama instance yang ingin dikueri.
Di panel kiri, klik database yang ingin Anda kueri, lalu klik
Spanner Studio.Masukkan kueri yang akan diuji, termasuk perintah
FORCE_INDEX
, lalu klik Run query.Konsol Google Cloud akan membuka tab Tabel hasil, lalu menampilkan hasil kueri, termasuk waktu yang dibutuhkan layanan Spanner untuk memproses kueri.
Metrik ini tidak termasuk sumber latensi lain, seperti waktu yang diperlukan Google Cloud Console untuk menafsirkan dan menampilkan hasil kueri.
Mendapatkan profil terperinci dari sebuah kueri dalam format JSON menggunakan REST API
Secara default, hanya hasil pernyataan yang ditampilkan saat Anda mengeksekusi kueri.
Ini karena QueryMode disetel ke NORMAL
.
Untuk menyertakan statistik eksekusi yang mendetail bersama hasil kueri, tetapkan QueryMode ke PROFILE
.
Membuat sesi
Sebelum memperbarui mode kueri, buat sesi, yang mewakili saluran komunikasi dengan layanan database Spanner.
- Klik
projects.instances.databases.sessions.create
. Masukkan ID project, instance, dan database dalam format berikut:
projects/[\PROJECT_ID\]/instances/[\INSTANCE_ID\]/databases/[\DATABASE_ID\]
Klik Jalankan. Responsnya menunjukkan sesi yang Anda buat dalam formulir ini:
projects/[\PROJECT_ID\]/instances/[\INSTANCE_ID\]/databases/[\DATABASE_ID\]/sessions/[\SESSION\]
Anda akan menggunakannya untuk melakukan profil kueri di langkah berikutnya. Sesi yang dibuat akan aktif paling lama satu jam di antara penggunaan berturut-turut sebelum dihapus oleh database.
Membuat profil kueri
Aktifkan mode PROFILE
untuk kueri.
- Klik
projects.instances.databases.sessions.executeSql
. Untuk sesi, masukkan ID sesi yang Anda buat di langkah sebelumnya:
projects/[PROJECT_ID]/instances/[INSTANCE_ID]/databases/[DATABASE_ID]/sessions/[SESSION]
Untuk Request body, gunakan:
{ "sql": "[YOUR_SQL_QUERY]", "queryMode": "PROFILE" }
Klik Jalankan. Respons yang ditampilkan akan mencakup hasil kueri, paket kueri, dan statistik eksekusi untuk kueri tersebut.