Halaman ini menjelaskan dan memberikan histori berbagai versi pengoptimal kueri Spanner. Versi default saat ini adalah 8. Untuk mempelajari pengoptimal kueri lebih lanjut, lihat Ringkasan pengoptimal kueri.
Spanner meluncurkan update pengoptimal kueri sebagai versi pengoptimal kueri baru. Secara default, setiap database mulai menggunakan versi pengoptimal terbaru paling cepat 30 hari setelah versi tersebut dirilis.
Anda dapat mengelola versi pengoptimal kueri yang digunakan kueri untuk database dialek GoogleSQL dan dialek PostgreSQL. Sebelum menggunakan versi terbaru, Anda dapat membandingkan profil performa kueri antara versi sebelumnya dan versi terbaru. Untuk mempelajari lebih lanjut, lihat Mengelola pengoptimal kueri.
Histori versi pengoptimal kueri
Berikut adalah ringkasan update yang dilakukan pada pengoptimal kueri di setiap rilis.
Versi 9: 21 Juli 2026 (terbaru)
Meningkatkan efisiensi gabungan penerapan terdistribusi (DA) dengan hanya mengirimkan kolom yang diperlukan dari input ke sisi peta gabungan.
Memilih indeks secara otomatis pada kolom yang dihitung, jika ekspresi yang dihitung sama adalah kondisi filter atau gabungan dalam kueri.
Contoh, mengaktifkan pemilihan indeks pada
Singers((LOWER(FirstName)))jika ada untuk kueri berikut:GoogleSQL
SELECT s.SingerId, s.FirstName, s.LastName FROM Singers s WHERE LOWER(s.FirstName) > 'k' LIMIT 10;PostgreSQL
SELECT s.singerid, s.firstname, s.lastname FROM singers s WHERE LOWER(s.firstname) > 'k' LIMIT 10;Meningkatkan performa pencarian indeks yang disisipkan dengan mengelompokkan dan mengurutkan kunci untuk pencarian berurutan yang efisien ke dalam penyimpanan.
Peningkatan kecil pada estimasi kardinalitas.
Secara heuristik, lebih memilih paket dengan penerapan terdistribusi daripada penerapan dengan gabungan terdistribusi di sisi peta jika tidak ada
LIMITdi atas penerapan.Memilih paket gabungan indeks secara lebih agresif.
Meningkatkan performa
GROUP BYdengan memperluas agregasi berbasis pemindaian untuk mendukung predikat filter tempat kunci agregasi dibandingkan dengan fungsi yang melibatkan konstanta dan parameter.Mengaktifkan pengoptimalan paket berbasis biaya untuk kueri yang melibatkan tabel dengan skema bernama.
Versi 8: 28 Oktober 2024 (default)
Klausa
WITHdipertimbangkan saat membuat pilihan paket berbasis biaya.Peningkatan performa kueri pencarian terindeks dan penerapan silang terdistribusi.
Peningkatan pengurutan ulang
JOIN.Peningkatan performa kueri dengan klausa
IN (...)yang besar.Peningkatan performa
GROUP BYdalam kasus tertentu.Peningkatan lainnya, termasuk penanganan kueri yang lebih efisien dengan
LIMIT, kunci asing, dan pemilihan indeks.
Versi 7: 22 Mei 2024
Menambahkan dukungan untuk pemilihan paket gabungan indeks berbasis biaya.
Menambahkan dukungan untuk pemilihan cerdas paket pencarian versus pemindaian berdasarkan statistik untuk kueri yang tidak memiliki predikat yang dapat dicari untuk semua bagian kunci.
Menambahkan dukungan untuk pemilihan gabungan hash berbasis biaya.
Versi 6: 11 September 2023
Peningkatan batas dan predikat yang didorong melalui gabungan luar penuh.
Peningkatan estimasi kardinalitas dan model biaya.
Mengaktifkan pengoptimalan berbasis biaya untuk kueri DML.
Versi 5: 15 Juli 2022
Peningkatan model biaya untuk pemilihan indeks, pengelolaan distribusi, penempatan pengurutan, dan pemilihan
GROUP BY.Menambahkan dukungan untuk pemilihan algoritma gabungan berbasis biaya yang memilih antara gabungan hash dan gabungan penerapan. Gabungan gabungan masih memerlukan penggunaan petunjuk kueri.
Menambahkan dukungan untuk komutativitas gabungan berbasis biaya.
Versi 4: 1 Maret 2022
Peningkatan pada pemilihan indeks sekunder.
- Peningkatan penggunaan indeks sekunder di bawah gabungan antara tabel yang disisipkan.
- Peningkatan penggunaan indeks sekunder yang mencakup.
- Peningkatan pemilihan indeks saat statistik pengoptimal sudah tidak berlaku.
- Lebih memilih indeks sekunder dengan predikat pada kolom terindeks utama meskipun statistik pengoptimal tidak tersedia atau melaporkan bahwa tabel dasar kecil.
Memperkenalkan gabungan hash satu kali, yang diaktifkan oleh petunjuk baru
hash_join_execution.Petunjuk Gabungan:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=hash_join, hash_join_execution=one_pass} (...)PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=hash_join, hash_join_execution=one_pass */ (...)Mode baru ini bermanfaat jika input sisi build gabungan hash berukuran besar. Gabungan hash satu kali diharapkan memiliki performa yang lebih baik jika Anda mengamati hal berikut dalam profil eksekusi kueri:
- Jumlah eksekusi pada turunan kanan gabungan hash lebih besar daripada jumlah eksekusi pada operator gabungan hash.
- Latensi pada turunan kanan operator gabungan hash juga tinggi.
Secara default (
hash_join_execution=multi_pass), jika input sisi build gabungan hash terlalu besar untuk dimuat dalam memori, sisi build akan dibagi menjadi beberapa batch dan kita mungkin memindai sisi probe beberapa kali. Dengan mode baru (hash_join_execution=one_pass), gabungan hash akan meluap ke disk jika input sisi build tidak dapat dimuat dalam memori dan akan selalu memindai sisi probe hanya sekali.Peningkatan dalam memilih jumlah kunci yang digunakan untuk pencarian.
Versi 3: 1 Agustus 2021
Menambahkan algoritma gabungan baru, gabungan gabungan, yang diaktifkan menggunakan nilai petunjuk kueri JOIN METHOD baru.
Petunjuk pernyataan:
GoogleSQL
@{join_method=merge_join} SELECT ...PostgreSQL
/*@ join_method=merge_join */ SELECT ...Petunjuk gabungan:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=merge_join} (...)PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=merge_join */ (...)Menambahkan algoritma gabungan baru, gabungan hash siaran push, yang diaktifkan menggunakan nilai petunjuk kueri baru JOIN METHOD.
Petunjuk gabungan:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=push_broadcast_hash_join} (...)PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=push_broadcast_hash_join} */ (...)Memperkenalkan operator gabungan gabungan terdistribusi, yang diaktifkan secara default jika berlaku. Operasi ini meningkatkan performa kueri.
Peningkatan kecil pada performa pemindaian di bawah
GROUP BYjika tidak ada agregat MAX atau MIN (atau HAVING MAX/MAX) dalam daftar SELECT. Sebelum perubahan ini, Spanner memuat kolom tambahan yang tidak dikelompokkan meskipun tidak diperlukan oleh kueri.Misalnya, pertimbangkan tabel berikut:
GoogleSQL
CREATE TABLE myTable( a INT64, b INT64, c INT64, d INT64) PRIMARY KEY (a, b, c);PostgreSQL
CREATE TABLE myTable( a bigint, b bigint, c bigint, d bigint, PRIMARY KEY(a, b, c) );Sebelum perubahan ini, kueri berikut akan memuat kolom
cmeskipun tidak diperlukan oleh kueri.SELECT a, b FROM myTable GROUP BY a, bMeningkatkan performa beberapa kueri dengan
LIMITjika ada operator penerapan silang yang diperkenalkan oleh gabungan dan kueri meminta hasil yang diurutkan dengan LIMIT. Setelah perubahan ini, pengoptimal akan menerapkan pengurutan dengan batas di sisi input penerapan silang terlebih dahulu.Contoh:
GoogleSQL
SELECT a2.* FROM Albums@{FORCE_INDEX=_BASE_TABLE} a1 JOIN Albums@{FORCE_INDEX=_BASE_TABLE} a2 USING(SingerId) ORDER BY a1.AlbumId LIMIT 2;PostgreSQL
SELECT a2.* FROM albums/*@ force_index=_base_table */ a1 JOIN albums/*@ force_index=_base_table */ a2 USING(singerid) ORDER BY a1.albumid LIMIT 2;Meningkatkan performa kueri dengan mendorong lebih banyak komputasi melalui
JOIN.Mendorong lebih banyak komputasi yang mungkin menyertakan subkueri atau konstruksi struct melalui gabungan. Hal ini meningkatkan performa kueri dalam beberapa cara seperti: Lebih banyak komputasi dapat dilakukan secara terdistribusi dan lebih banyak operasi yang bergantung pada komputasi yang didorong juga dapat didorong ke bawah. Misalnya, kueri memiliki batas dan urutan pengurutan bergantung pada komputasi tersebut, sehingga batas juga dapat didorong melalui gabungan.
Contoh:
SELECT t.ConcertDate, ( SELECT COUNT(*) FROM UNNEST(t.TicketPrices) p WHERE p > 10 ) AS expensive_tickets, u.VenueName FROM Concerts t JOIN Venues u ON t.VenueId = u.VenueId ORDER BY expensive_tickets LIMIT 2;
Versi 2: 1 Maret 2020
- Menambahkan pengoptimalan dalam pemilihan indeks.
- Meningkatkan performa predikat
REGEXP_CONTAINSdanLIKEdalam keadaan tertentu. - Meningkatkan performa pemindaian di bawah
GROUP BYdalam situasi tertentu.
Versi 1: 18 Juni 2019
Menyertakan banyak pengoptimalan berbasis aturan seperti pushdown predikat, pushdown batas, gabungan redundan, dan penghapusan ekspresi redundan.
Menggunakan statistik data pengguna untuk memilih indeks yang akan digunakan untuk mengakses setiap tabel.
Langkah berikutnya
- Untuk mempelajari pengoptimal kueri lebih lanjut, lihat Tentang pengoptimal kueri.
- Untuk mengelola versi pengoptimal dan paket statistik untuk skenario Anda, lihat Mengelola pengoptimal kueri.