Halaman ini menjelaskan cara mendeteksi perubahan kecepatan eksekusi kueri, memeriksa rencana eksekusi kueri, dan menentukan indeks yang berbeda untuk kueri mendatang jika diperlukan.
Mendapatkan profil mendetail kueri dalam format JSON menggunakan REST API
Secara default, saat Anda menjalankan kueri, API hanya menampilkan hasil pernyataan.
Hal ini karena queryMode ditetapkan ke NORMAL. Untuk menyertakan statistik eksekusi mendetail dengan hasil kueri, tetapkan queryMode ke PROFILE.
Membuat sesi
Sebelum memperbarui mode kueri, buat sesi, yang mewakili saluran komunikasi dengan layanan database Spanner.
- Buka halaman
projects.instances.databases.sessions.create. Berikan project ID, ID instance, dan ID database dalam formulir berikut:
projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_IDKlik Jalankan. Respons akan menampilkan sesi yang Anda buat dalam formulir ini:
projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID/sessions/SESSION_IDGunakan sesi ini untuk membuat profil kueri di langkah berikutnya. Sesi tetap aktif hingga satu jam di antara penggunaan berturut-turut sebelum Spanner menghapusnya.
Untuk mengetahui informasi selengkapnya tentang cara menggunakan sesi, lihat Sesi.
Membuat profil kueri
Aktifkan mode PROFILE untuk kueri.
- Buka halaman
projects.instances.databases.sessions.executeSql. Untuk session, masukkan ID sesi yang Anda buat di Membuat sesi:
projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID/sessions/SESSION_IDUntuk Request body, gunakan kode berikut:
{ "sql": "SQL_QUERY", "queryMode": "PROFILE" }Klik Jalankan. Responsnya mencakup hasil kueri, rencana kueri, dan statistik eksekusi untuk kueri tersebut.
Memecahkan masalah penggunaan indeks
Saat Anda menggunakan kueri SQL untuk mencari data, Spanner akan otomatis menggunakan indeks sekunder yang kemungkinan akan mengambil data dengan lebih efisien. Namun, dalam beberapa kasus, Spanner mungkin memilih indeks yang menyebabkan kueri menjadi lebih lambat. Oleh karena itu, Anda mungkin melihat beberapa kueri berjalan lebih lambat dari yang diharapkan.
Mendeteksi perubahan kecepatan eksekusi kueri
Anda kemungkinan besar akan melihat perubahan kecepatan eksekusi kueri setelah melakukan salah satu perubahan berikut:
- Mengubah secara signifikan sejumlah besar data yang ada yang memiliki indeks sekunder.
- Menambahkan, mengubah, atau menghapus indeks sekunder.
Anda dapat menggunakan berbagai alat untuk mengidentifikasi kueri tertentu yang dieksekusi Spanner lebih lambat dari biasanya:
- Query Insights 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 untuk mengetahui versi pengoptimal kueri yang digunakan untuk menjalankan kueri.
Alat pemantauan sisi klien yang mengukur performa aplikasi Anda.
Statistik pengoptimal untuk database yang baru dibuat
Saat Anda 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 secara otomatis. Untuk mengoptimalkan penggunaan indeks database Spanner baru lebih cepat, Anda dapat membuat paket statistik baru secara manual.
Tinjau skema
Setelah menemukan kueri yang melambat, lihat pernyataan SQL untuk kueri tersebut, dan 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, yang berarti Spanner mungkin 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 listuntuk 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 telah memengaruhi performa kueri. Tambahkan kembali indeks sekunder ke tabel. Setelah Spanner menambahkan indeks, jalankan kueri lagi dan lihat performanya. Jika performa tidak meningkat, langkah berikutnya adalah menemukan indeks yang digunakan Spanner untuk kueri.
Jika Anda tidak menghapus indeks yang berlaku, pemilihan indeks tidak akan menyebabkan penurunan performa kueri. Cari perubahan lain pada data atau pola penggunaan Anda yang mungkin 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 Instances Spanner di konsolGoogle Cloud .
Klik nama instance yang ingin Anda kueri.
Di menu navigasi, pilih database yang ingin Anda kueri, lalu klik Spanner Studio.
Masukkan kueri yang akan diuji.
Di menu Run query, pilih Explanation only. Spanner akan menampilkan rencana kueri.
Cari setidaknya salah satu operator berikut dalam rencana kueri:
- Pemindaian tabel
- Pemindaian indeks
- Cross apply atau distributed cross apply
Bagian berikut menjelaskan arti setiap operator.
Operator pemindaian tabel
Operator pemindaian tabel menunjukkan bahwa Spanner tidak menggunakan indeks sekunder:
Misalnya, 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, rencana 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, rencana kueri menyertakan operator pemindaian indeks.
Operator cross apply
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, rencana kueri menyertakan operator cross apply atau distributed cross apply 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 kueri memilih semua kolom dalam tabel, bukan hanya AlbumTitle. Akibatnya, rencana kueri
mencakup operator cross apply terdistribusi, dengan pemindaian indeks
AlbumsByAlbumTitle dan pemindaian tabel Albums sebagai inputnya.
Memilih 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 berikut untuk memutuskan indeks yang akan diuji untuk kueri:
Jika kueri Anda memenuhi salah satu kriteria ini, coba gunakan tabel dasar, bukan indeks sekunder:
- Kueri 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 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 dalam predikat.
Menguji kueri yang diperbarui
Gunakan konsol Google Cloud untuk menguji kueri yang diperbarui dan mencari tahu berapa lama waktu yang diperlukan untuk memproses kueri.
Jika kueri Anda menyertakan parameter kueri, dan parameter kueri terikat ke beberapa nilai jauh lebih sering daripada yang lain, 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, 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 Instances Spanner di konsolGoogle Cloud .
Klik nama instance yang ingin Anda kueri.
Di menu navigasi, klik database yang ingin Anda buat kuerinya, lalu klik Spanner Studio.
Masukkan kueri yang akan diuji, termasuk perintah
FORCE_INDEX, lalu klik Run query.Konsol Google Cloud akan membuka tab Results table, lalu menampilkan hasil kueri, termasuk berapa lama waktu yang diperlukan layanan Spanner untuk memproses kueri.
Metrik ini tidak mencakup sumber latensi lainnya, seperti waktu yang diperlukan konsol Google Cloud untuk menafsirkan dan menampilkan hasil kueri.
Throttling kueri
Selama eksekusi kueri, Spanner dapat men-throttle kueri di beberapa tempat.
Waktu tunggu klien dan Penundaan antrean server adalah dua metrik throttling utama.
Waktu tunggu klien
Waktu tunggu klien menunjukkan jumlah waktu yang dihabiskan klien Spanner untuk menunggu aplikasi menggunakan hasil. Hal ini menunjukkan bahwa klien tidak dapat memproses hasil secepat Spanner memproduksinya. Untuk mengatasi masalah ini, tingkatkan performa aplikasi yang menggunakan atau buffer semua hasil di aplikasi klien dan proses setelah kueri selesai.
Penundaan antrean server
Penundaan antrean server terjadi saat server pemrosesan menunda penjadwalan eksekusi kueri. Di panel Query summary, periksa metrik Server queue delay; jika metrik tidak ada, berarti tidak ada penundaan server yang terjadi.
Penundaan ini dapat menunjukkan bahwa server yang menjalankan kueri kelebihan beban. Untuk memverifikasi apakah hotspot ada, lihat Menemukan hotspot di database Anda. Untuk memecahkan masalah hotspot, lihat Memecahkan masalah hotspot menggunakan statistik pemisahan panas.
Data yang baru diubah
Perubahan pada data tabel dapat memengaruhi performa kueri.
Paket statistik usang
Jika pengoptimal menggunakan paket statistik yang sudah tidak berlaku, pengoptimal mungkin memilih rencana yang kurang optimal. Di bagian Query summary, Anda dapat memeriksa paket statistik.
Jika paket sudah usang atau tidak ada, jalankan
ANALYZE
untuk memastikan statistik pengoptimal sudah yang terbaru.

Untuk mengetahui informasi selengkapnya, lihat Paket statistik.
Perubahan konten tabel
Performa kueri bergantung pada data yang diproses kueri. Cara terbaik untuk mengatasi masalah performa kueri bergantung pada cara data berubah:
- Kemiringan dalam distribusi nilai: paket statistik menangkap kemiringan ini, tetapi pengoptimal kueri hanya dapat menggunakan informasi ini saat Anda menggunakan nilai literal dalam kueri.
- Perubahan besar dalam jumlah baris: evaluasi apakah predikat cukup memfilter baris seiring bertambahnya ukuran tabel.
- Kemiringan dalam ukuran nilai: kemiringan dalam ukuran nilai bermasalah jika
digabungkan dengan predikat skalar yang mahal (misalnya, melakukan
predikat
LIKEpada nilaiSTRINGyang berisi string besar).
Untuk mendapatkan insight selengkapnya tentang eksekusi kueri, gunakan REST API.