Pengoptimal kueri Spanner menentukan cara yang paling efisien untuk menjalankan kueri SQL. Namun, paket kueri yang ditentukan oleh pengoptimal dapat sedikit berubah ketika pengoptimal kueri itu sendiri berkembang, atau ketika statistik database diperbarui. Untuk meminimalkan potensi regresi performa saat statistik kueri atau pengoptimal kueri berubah, Spanner menyediakan opsi kueri berikut ini.
optimizer_version: Perubahan pada pengoptimal kueri dipaketkan dan dirilis sebagai versi pengoptimal. Spanner mulai menggunakan versi terbaru pengoptimal 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 teratur. Statistik baru tersedia sebagai satu paket. Opsi kueri ini menentukan paket statistik yang akan digunakan oleh pengoptimal kueri saat mengompilasi kueri SQL. Paket yang ditentukan harus menonaktifkan pembersihan sampah memori:
GoogleSQL
ALTER STATISTICSSET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."" SET OPTIONS (allow_gc = true)
Panduan ini menunjukkan cara menetapkan masing-masing opsi ini pada berbagai cakupan di Spanner.
Mencantumkan opsi pengoptimal kueri
Spanner menyimpan informasi tentang versi pengoptimal yang tersedia dan paket statistik yang dapat Anda pilih.
Versi pengoptimal
Versi pengoptimal kueri adalah nilai bilangan bulat, yang bertambah 1 pada setiap update. Versi terbaru pengoptimal kueri adalah 6.
Jalankan pernyataan SQL berikut untuk menampilkan daftar semua versi pengoptimal yang didukung, beserta tanggal rilisnya 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 versi terbaru pengoptimal setidaknya 30 hari setelah versi tersebut dirilis. Selama periode lebih dari 30 hari antara rilis baru dan rilis tersebut yang menjadi default, sebaiknya uji kueri terhadap versi baru untuk mendeteksi regresi apa pun.
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 merupakan 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 akan diberi nama paket yang dijamin unik dalam database yang diberikan.
Format nama paket adalah auto_{PACKAGE_TIMESTAMP}UTC
.
Di GoogleSQL, pernyataan ANALYZE
memicu pembuatan nama paket statistik. Di PostgreSQL, pernyataan ANALYZE
menjalankan tugas ini. Format nama paket statistik adalah
analyze_{PACKAGE_TIMESTAMP}UTC
, dengan
{PACKAGE_TIMESTAMP}
adalah stempel waktu, dalam zona waktu UTC, saat
konstruksi 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 melompat ke bagian tersebut dalam dokumen ini).
Spanner default ← opsi database ← aplikasi klien ← variabel lingkungan ← kueri klien ← petunjuk pernyataan
Misalnya, berikut ini cara menafsirkan urutan prioritas saat menetapkan versi pengoptimal kueri:
Saat Anda membuat database, database tersebut menggunakan versi pengoptimal default Spanner. Menetapkan versi pengoptimal menggunakan salah satu metode yang tercantum di atas akan diprioritaskan daripada apa pun yang ada di sebelah kirinya. Misalnya, penetapan pengoptimal untuk aplikasi yang 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, lebih diutamakan daripada kumpulan nilai menggunakan metode lain.
Sekarang, mari kita lihat setiap metode secara lebih mendetail.
Menetapkan opsi pengoptimal di tingkat database
Anda dapat menetapkan versi pengoptimal default pada database menggunakan perintah DDL
ALTER DATABASE
berikut.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 6);
PostgreSQL
ALTER DATABASE MyDatabase SET spanner.optimizer_version = 5;
Anda dapat menetapkan paket statistik dengan cara yang sama, seperti yang ditunjukkan pada 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 = 6,
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 = 6 )'
PostgreSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET spanner.optimizer_version = 6'
Menyetel opsi database ke NULL
akan menghapusnya sehingga nilai default digunakan.
Guna melihat nilai saat ini dari opsi ini untuk database, buat 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 dengan library klien
Saat Anda berinteraksi secara terprogram dengan Spanner melalui library klien, ada sejumlah cara untuk mengubah opsi kueri untuk aplikasi klien Anda.
Anda harus menggunakan library klien versi terbaru untuk menetapkan opsi pengoptimal.
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 di instance klien dan diterapkan ke semua kueri yang dijalankan selama masa aktif klien. Meskipun opsi berlaku pada level database di backend, ketika opsi ditetapkan pada level klien, opsi tersebut berlaku untuk semua database yang terhubung ke klien tersebut.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Menetapkan opsi pengoptimal dengan variabel lingkungan
Agar lebih mudah untuk mencoba berbagai setelan pengoptimal yang berbeda tanpa harus
mengompilasi ulang aplikasi, Anda dapat menetapkan variabel lingkungan SPANNER_OPTIMIZER_VERSION
dan
SPANNER_OPTIMIZER_STATISTICS_PACKAGE
serta menjalankan aplikasi,
seperti yang ditunjukkan dalam cuplikan berikut.
Linux / Mac
export SPANNER_OPTIMIZER_VERSION="6"
export SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
Windows
set SPANNER_OPTIMIZER_VERSION="6"
set SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
Nilai opsi pengoptimal kueri yang ditentukan dibaca dan disimpan di instance klien pada waktu inisialisasi klien dan berlaku untuk semua kueri yang berjalan selama masa aktif klien.
Menetapkan opsi pengoptimal untuk kueri klien
Anda dapat menetapkan 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 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 untuk dijalankan menggunakan versi pengoptimal kueri
yang ditetapkan.
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=6} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=6*/ SELECT * FROM MyTable;
Anda juga dapat menggunakan literal latest_version untuk menetapkan versi pengoptimal untuk kueri ke versi terbaru seperti yang ditampilkan 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 untuk dijalankan 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 ditentukan, petunjuk pernyataan 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 terbaru untuk menggunakan paket statistik terbaru.
@{OPTIMIZER_STATISTICS_PACKAGE=latest} SELECT * FROM MyTable;
Kedua petunjuk dapat disetel dalam satu pernyataan seperti yang ditunjukkan pada contoh berikut.
Literal default_version menetapkan versi pengoptimal untuk sebuah kueri ke versi default, yang mungkin berbeda dari 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 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 dalam driver JDBC Spanner versi terbaru.
Anda juga dapat menetapkan versi pengoptimal kueri menggunakan pernyataan SET OPTIMIZER_VERSION
seperti yang ditunjukkan dalam contoh berikut.
Untuk detail selengkapnya tentang cara menggunakan driver open source, baca Menggunakan driver JDBC open source.
Cara penanganan versi pengoptimal yang tidak valid
Spanner mendukung rentang versi pengoptimal.
Rentang ini berubah seiring waktu ketika 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=7}
,
tetapi nomor versi pengoptimal terbaru hanya
6
, Spanner akan merespons dengan
pesan error ini:
Query optimizer version: 7 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 diberikan tidak valid. Paket statistik yang ditentukan oleh kueri harus berupa:
Menentukan versi pengoptimal kueri yang digunakan untuk menjalankan kueri
Versi pengoptimal yang digunakan untuk kueri dapat dilihat melalui Google Cloud Console dan di Google Cloud CLI.
Konsol Google Cloud
Untuk melihat versi pengoptimal yang digunakan untuk kueri, jalankan kueri Anda di halaman Spanner Studio di Konsol Google Cloud, lalu pilih tab Explanation. Anda akan melihat pesan yang mirip seperti berikut ini:
Versi pengoptimal kueri: 6
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 Anda. Salah satu metrik yang dikumpulkan untuk Spanner adalah jumlah kueri, yang mengukur jumlah kueri dalam sebuah instance, yang diambil sampelnya dari waktu ke waktu. Meskipun metrik ini sangat berguna untuk melihat kueri yang dikelompokkan berdasarkan kode error, kita juga dapat menggunakannya untuk melihat versi pengoptimal apa yang digunakan untuk menjalankan setiap kueri.
Anda dapat menggunakan Metrics Explorer di Konsol Google Cloud untuk memvisualisasikan Jumlah kueri untuk instance database. Gambar 1 menunjukkan jumlah kueri untuk tiga database. Anda dapat melihat versi pengoptimal mana yang digunakan di setiap database.
Tabel di bawah diagram dalam 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 lain menjalankan kueri masing-masing
menggunakan versi 1 dan 2 dari pengoptimal.
Gambar 1. Jumlah kueri yang ditampilkan di Metrics Explorer dengan kueri yang dikelompokkan berdasarkan versi pengoptimal.
Untuk menyiapkan diagram serupa untuk instance Anda:
- Buka Metrics Explorer di Konsol Google Cloud.
- Di kolom Resource type, pilih
Cloud Spanner Instance
. - Di kolom Metric, pilih
Count of queries
. - Di kolom Group By, pilih
database
,optimizer_version
, danstatus
.
Tidak ditampilkan dalam contoh ini jika versi pengoptimal yang berbeda digunakan untuk kueri yang berbeda dalam database yang sama. Dalam hal ini, diagram akan menampilkan segmen batang untuk setiap kombinasi versi database dan pengoptimal.
Untuk mempelajari cara menggunakan Cloud Monitoring untuk memantau instance Spanner, lihat Memantau dengan Cloud Monitoring