Halaman ini menjelaskan cara mengelola pengoptimal kueri di Spanner untuk database dialek GoogleSQL dan database dialek PostgreSQL.
Pengoptimal kueri Spanner menentukan cara paling efisien untuk menjalankan kueri SQL. Namun, rencana kueri yang ditentukan oleh pengoptimal dapat sedikit berubah saat pengoptimal kueri itu sendiri berkembang, atau saat statistik database diperbarui. Untuk meminimalkan potensi regresi performa saat pengoptimal kueri atau statistik berubah, Spanner menyediakan opsi kueri berikut.
optimizer_version: Perubahan pada pengoptimal kueri dikelompokkan dan dirilis sebagai versi pengoptimal. Spanner mulai menggunakan pengoptimal versi terbaru sebagai default setidaknya 30 hari setelah versi tersebut dirilis. Anda dapat menggunakan opsi versi pengoptimal kueri untuk menjalankan kueri terhadap pengoptimal versi lama.
optimizer_statistics_package: Spanner memperbarui statistik pengoptimal secara rutin. Statistik baru tersedia sebagai paket. Opsi kueri ini menentukan paket statistik yang akan digunakan pengoptimal kueri saat mengompilasi kueri SQL. Paket yang ditentukan harus menonaktifkan garbage collection:
GoogleSQL
ALTER STATISTICS <package_name> SET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."<package_name>" SET OPTIONS (allow_gc = false)
Panduan ini menunjukkan cara menetapkan setiap opsi ini pada cakupan yang berbeda di Spanner.
Mencantumkan opsi pengoptimal kueri
Spanner menyimpan informasi tentang versi pengoptimal dan paket statistik yang tersedia yang dapat Anda pilih.
Versi pengoptimal
Versi pengoptimal kueri adalah nilai bilangan bulat, yang bertambah 1 dengan setiap pembaruan. Versi pengoptimal kueri terbaru adalah 9.
Jalankan pernyataan SQL berikut untuk menampilkan daftar semua versi pengoptimal yang didukung, beserta tanggal rilis yang sesuai dan apakah versi tersebut adalah default. Nomor versi terbesar yang ditampilkan adalah versi pengoptimal terbaru yang didukung.
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS;
Versi default
Secara default, Spanner mulai menggunakan pengoptimal versi terbaru setidaknya 30 hari setelah versi tersebut dirilis. Selama periode 30+ hari antara rilis baru dan rilis tersebut menjadi default, sebaiknya uji kueri terhadap versi baru untuk mendeteksi regresi.
Untuk menemukan versi default, jalankan pernyataan SQL berikut:
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS;
Kueri menampilkan daftar semua versi pengoptimal yang didukung. Kolom IS_DEFAULT menentukan versi mana yang menjadi default saat ini.
Untuk mengetahui detail tentang setiap versi, lihat Histori versi pengoptimal kueri.
Paket statistik pengoptimal
Setiap paket statistik pengoptimal baru yang dibuat Spanner diberi nama paket yang dijamin unik dalam database tertentu.
Format nama paketnya adalah auto_{PACKAGE_TIMESTAMP}UTC.
Di GoogleSQL, pernyataan ANALYZE
memicu pembuatan nama paket statistik. Di
PostgreSQL, pernyataan
ANALYZE
melakukan tugas ini. Format nama paket statistik adalah
analyze_{PACKAGE_TIMESTAMP}UTC, dengan
{PACKAGE_TIMESTAMP} adalah stempel waktu, dalam zona waktu UTC, saat
pembuatan statistik dimulai. Jalankan pernyataan SQL berikut untuk menampilkan daftar semua paket statistik pengoptimal yang tersedia.
SELECT * FROM INFORMATION_SCHEMA.SPANNER_STATISTICS;
Secara default, Spanner menggunakan paket statistik pengoptimal terbaru kecuali jika database atau kueri disematkan ke paket lama menggunakan salah satu metode yang dijelaskan di halaman ini.
Prioritas penggantian opsi
Jika Anda menggunakan database dialek GoogleSQL, Spanner menawarkan beberapa cara untuk mengubah opsi pengoptimal. Misalnya, Anda dapat menetapkan opsi untuk kueri tertentu atau mengonfigurasi opsi di library klien pada tingkat proses atau kueri. Jika opsi ditetapkan dengan beberapa cara, urutan prioritas berikut akan berlaku. (Pilih link untuk membuka bagian tersebut dalam dokumen ini).
Default Spanner ← opsi database ← aplikasi klien ← variabel lingkungan ← kueri klien ← petunjuk pernyataan
Misalnya, berikut cara menafsirkan urutan prioritas saat menetapkan versi pengoptimal kueri:
Saat Anda membuat database, database tersebut akan menggunakan versi pengoptimal default Spanner . Menetapkan versi pengoptimal menggunakan salah satu metode yang tercantum sebelumnya lebih diutamakan daripada apa pun di sebelah kirinya. Misalnya, menetapkan pengoptimal untuk aplikasi menggunakan variabel lingkungan lebih diutamakan daripada nilai apa pun yang Anda tetapkan untuk database menggunakan opsi database. Menetapkan versi pengoptimal melalui petunjuk pernyataan memiliki prioritas tertinggi untuk kueri tertentu, yang lebih diutamakan daripada nilai yang ditetapkan menggunakan metode lain.
Bagian berikut memberikan detail selengkapnya tentang setiap metode.
Menetapkan opsi pengoptimal
Anda dapat menetapkan opsi pengoptimal default melalui metode berikut:
- Di tingkat database
- Untuk kueri menggunakan petunjuk pernyataan
- Dengan library klien
- Menggunakan driver JDBC Spanner
Dalam beberapa kasus, Spanner mungkin menggunakan versi pengoptimal kueri yang lebih lama untuk bentuk kueri tertentu, meskipun Anda telah menyematkan versi yang lebih baru. Ini adalah perilaku internal yang diharapkan untuk memastikan stabilitas dan performa kueri. Anda dapat mengidentifikasi versi pengoptimal yang digunakan untuk kueri tertentu dengan memeriksa rencana eksekusi kueri.
Menetapkan opsi pengoptimal di tingkat database
Untuk menetapkan versi pengoptimal default di database, gunakan perintah DDL ALTER
DATABASE berikut. Menetapkan opsi ini tidak mengharuskan semua kueri menjalankan versi tersebut. Sebagai gantinya, opsi ini menetapkan batas atas pada versi QO yang digunakan untuk kueri. Tujuannya adalah untuk mengurangi regresi yang terjadi setelah versi pengoptimal baru dirilis.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 9);
PostgreSQL
ALTER DATABASE MyDatabase SET spanner.optimizer_version = 5;
Anda dapat menetapkan paket statistik dengan cara yang sama, seperti yang ditunjukkan dalam contoh berikut.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_statistics_package = "auto_20191128_14_47_22UTC");
PostgreSQL
ALTER DATABASE MyDatabase
SET spanner.optimizer_statistics_package = "auto_20191128_14_47_22UTC";
Anda juga dapat menetapkan lebih dari satu opsi secara bersamaan, seperti yang ditunjukkan dalam perintah DDL berikut.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 9,
optimizer_statistics_package = "auto_20191128_14_47_22UTC");
Anda dapat menjalankan ALTER DATABASE di gcloud CLI dengan perintah
gcloud CLI databases ddl update sebagai berikut.
GoogleSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET OPTIONS ( optimizer_version = 9 )'PostgreSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET spanner.optimizer_version = 9'Menetapkan opsi database ke NULL (di GoogleSQL) atau DEFAULT (di PostgreSQL) akan menghapusnya sehingga nilai default digunakan.
Untuk melihat nilai opsi saat ini untuk database, kueri tampilan
INFORMATION_SCHEMA.DATABASE_OPTIONS untuk GoogleSQL, atau tabel
information_schema database_options untuk PostgreSQL, sebagai berikut.
GoogleSQL
SELECT
s.OPTION_NAME,
s.OPTION_VALUE
FROM
INFORMATION_SCHEMA.DATABASE_OPTIONS s
WHERE
s.SCHEMA_NAME=""
AND s.OPTION_NAME IN ('optimizer_version', 'optimizer_statistics_package')
PostgreSQL
SELECT
s.option_name,
s.option_value
FROM
information_schema.database_options s
WHERE
s.schema_name='public'
AND s.option_name IN ('optimizer_version',
'optimizer_statistics_package')
Menetapkan opsi pengoptimal untuk kueri menggunakan petunjuk pernyataan
Petunjuk pernyataan adalah petunjuk pada pernyataan kueri yang mengubah eksekusi
kueri dari perilaku default. Menetapkan petunjuk OPTIMIZER_VERSION pada pernyataan akan memaksa kueri tersebut berjalan menggunakan versi pengoptimal kueri yang ditentukan.
Petunjuk OPTIMIZER_VERSION memiliki prioritas versi pengoptimal tertinggi. Jika petunjuk pernyataan ditentukan, petunjuk tersebut akan digunakan terlepas dari semua setelan versi pengoptimal lainnya.
GoogleSQL
@{OPTIMIZER_VERSION=9} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=9*/ SELECT * FROM MyTable;
Anda juga dapat menggunakan literal latest_version untuk menetapkan versi pengoptimal untuk kueri ke versi terbaru seperti yang ditunjukkan di sini.
GoogleSQL
@{OPTIMIZER_VERSION=latest_version} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=latest_version*/ SELECT * FROM MyTable;
Menetapkan petunjuk OPTIMIZER_STATISTICS_PACKAGE pada pernyataan akan memaksa kueri tersebut berjalan menggunakan versi paket statistik pengoptimal kueri yang ditentukan. Paket yang ditentukan
harus menonaktifkan pembersihan sampah memori:
GoogleSQL
ALTER STATISTICS <package_name> SET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."<package_name>" SET OPTIONS (allow_gc=false)
Petunjuk OPTIMIZER_STATISTICS_PACKAGE memiliki prioritas setelan paket pengoptimal tertinggi. Jika petunjuk pernyataan ditentukan, petunjuk tersebut akan digunakan terlepas dari semua setelan versi paket pengoptimal lainnya.
@{OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC} SELECT * FROM MyTable;
Anda juga dapat menggunakan literal latest untuk menggunakan paket statistik terbaru.
@{OPTIMIZER_STATISTICS_PACKAGE=latest} SELECT * FROM MyTable;
Kedua petunjuk dapat ditetapkan dalam satu pernyataan seperti yang ditunjukkan dalam contoh berikut.
Literal default_version menetapkan versi pengoptimal untuk kueri ke versi default, yang mungkin berbeda dengan versi terbaru. Lihat Versi default untuk mengetahui detailnya.
GoogleSQL
@{OPTIMIZER_VERSION=default_version, OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=default_version, OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC*/ SELECT * FROM KeyValue;
Menetapkan opsi pengoptimal dengan library klien
Saat Anda berinteraksi secara terprogram dengan Spanner melalui library klien, ada beberapa cara untuk mengubah opsi kueri untuk aplikasi klien Anda.
Anda harus menggunakan library klien versi terbaru untuk menetapkan opsi pengoptimal.
Untuk klien database
Aplikasi dapat menetapkan opsi pengoptimal secara global di library klien dengan mengonfigurasi properti opsi kueri seperti yang ditunjukkan dalam cuplikan kode berikut. Setelan pengoptimal disimpan dalam instance klien dan diterapkan ke semua kueri yang dijalankan selama masa aktif klien. Meskipun opsi berlaku di tingkat database di backend, saat opsi ditetapkan di tingkat klien, opsi tersebut berlaku untuk semua database yang terhubung ke klien tersebut.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Dengan variabel lingkungan
Untuk memudahkan mencoba setelan pengoptimal yang berbeda tanpa harus mengompilasi ulang aplikasi, Anda dapat menetapkan variabel lingkungan SPANNER_OPTIMIZER_VERSION dan SPANNER_OPTIMIZER_STATISTICS_PACKAGE, lalu menjalankan aplikasi Anda, seperti yang ditunjukkan dalam cuplikan berikut.
Linux / macOS
export SPANNER_OPTIMIZER_VERSION="9"
export SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"Windows
set SPANNER_OPTIMIZER_VERSION="9"
set SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"Nilai opsi pengoptimal kueri yang ditentukan dibaca dan disimpan dalam instance klien pada waktu inisialisasi klien dan berlaku untuk semua kueri yang dijalankan selama masa aktif klien.
Untuk kueri klien
Anda dapat menentukan nilai untuk versi pengoptimal atau versi paket statistik di tingkat kueri dalam aplikasi klien dengan menentukan properti opsi kueri saat membuat kueri.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Menetapkan opsi pengoptimal saat menggunakan driver JDBC Spanner
Anda dapat mengganti nilai default versi pengoptimal dan paket statistik dengan menentukan opsi dalam string koneksi JDBC seperti yang ditunjukkan dalam contoh berikut.
Opsi ini hanya didukung di driver JDBC Spanner versi terbaru .
Anda juga dapat menetapkan versi pengoptimal kueri menggunakan pernyataan SET OPTIMIZER_VERSION seperti yang ditunjukkan dalam contoh berikut.
Untuk mengetahui detail selengkapnya tentang penggunaan driver open source, lihat Menggunakan driver JDBC open source.
Cara penanganan versi pengoptimal yang tidak valid
Spanner mendukung berbagai versi pengoptimal.
Rentang ini berubah dari waktu ke waktu saat pengoptimal kueri diperbarui. Jika versi yang Anda tentukan berada di luar rentang, kueri akan gagal. Misalnya, jika Anda mencoba menjalankan kueri dengan petunjuk pernyataan @{OPTIMIZER_VERSION=10}, tetapi nomor versi pengoptimal terbaru hanya 9, Spanner akan merespons dengan pesan error ini:
Query optimizer version: 10 is not
supported
Menangani setelan paket statistik pengoptimal yang tidak valid
Anda dapat menyematkan database atau kueri ke paket statistik yang tersedia menggunakan salah satu metode yang dijelaskan sebelumnya di halaman ini. Kueri akan gagal jika nama paket statistik yang tidak valid diberikan. Paket statistik yang ditentukan oleh kueri harus:
Menentukan versi pengoptimal kueri yang digunakan untuk menjalankan kueri
Versi pengoptimal yang digunakan untuk kueri dapat dilihat melalui Google Cloud konsol dan di Google Cloud CLI.
Google Cloud Konsol
Untuk melihat versi pengoptimal yang digunakan untuk kueri, jalankan kueri Anda di halaman Spanner Studio Google Cloud konsol, lalu pilih tab Penjelasan. Anda akan melihat pesan yang mirip dengan yang berikut ini:
Versi pengoptimal kueri: 9
gcloud CLI
Untuk melihat versi yang digunakan saat menjalankan kueri di gcloud CLI, tetapkan flag --query-mode ke PROFILE seperti yang ditunjukkan dalam cuplikan berikut.
gcloud spanner databases execute-sql MyDatabase --instance=test-instance \
--query-mode=PROFILE --sql='SELECT * FROM MyTable'Memvisualisasikan versi pengoptimal kueri di Metrics Explorer
Cloud Monitoring mengumpulkan pengukuran untuk membantu Anda memahami performa aplikasi dan layanan sistem. Salah satu metrik yang dikumpulkan untuk Spanner adalah jumlah kueri, yang mengukur jumlah kueri dalam instance, yang diambil sampelnya dari waktu ke waktu. Meskipun metrik ini sangat berguna untuk melihat kueri yang dikelompokkan menurut kode error, kita juga dapat menggunakannya untuk melihat versi pengoptimal yang digunakan untuk menjalankan setiap kueri.
Anda dapat menggunakan Metrics Explorer di Google Cloud konsol untuk memvisualisasikan Jumlah kueri untuk instance database Anda. Gambar 1 menunjukkan jumlah kueri untuk tiga database. Anda dapat melihat versi pengoptimal yang digunakan di setiap database.
Tabel di bawah diagram pada gambar ini menunjukkan bahwa my-db-1 mencoba menjalankan kueri dengan versi pengoptimal yang tidak valid, yang menampilkan status Penggunaan buruk dan menghasilkan jumlah kueri 0. Database lainnya menjalankan kueri menggunakan pengoptimal versi 1 dan 2.

Gambar 1. Jumlah kueri yang ditampilkan di Metrics Explorer dengan kueri yang dikelompokkan menurut versi pengoptimal.
Untuk menyiapkan diagram serupa untuk instance Anda:
- Buka Metrics Explorer di Google Cloud konsol.
- Di kolom Jenis resource, pilih
Cloud Spanner Instance. - Di kolom Metrik, pilih
Count of queries. - Di kolom Group By, pilih
database,optimizer_version, danstatus.
Contoh ini tidak menunjukkan kasus saat versi pengoptimal yang berbeda digunakan untuk kueri yang berbeda di database yang sama. Dalam hal ini, diagram akan menampilkan segmen batang untuk setiap kombinasi database dan versi pengoptimal.
Untuk mempelajari cara menggunakan Cloud Monitoring untuk memantau instance Spanner, lihat Pemantauan dengan Cloud Monitoring