Halaman ini menjelaskan dan memberikan histori berbagai versi pengoptimal kueri Spanner. Versi default saat ini adalah 7. Untuk mempelajari pengoptimal kueri lebih lanjut, lihat Tentang pengoptimal kueri.
Spanner meluncurkan update pengoptimal kueri sebagai versi pengoptimal kueri baru. Secara default, setiap database mulai menggunakan pengoptimal versi terbaru paling lambat 30 hari setelah versi tersebut dirilis.
Jika menggunakan database dialek GoogleSQL, Anda dapat mengelola versi pengoptimal kueri yang digunakan kueri Anda. Sebelum berkomitmen ke 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 8: 28 Oktober 2024 (terbaru)
Klausul
WITH
dipertimbangkan saat membuat pilihan paket berbasis biaya.Meningkatkan performa kueri penelusuran terdistribusi dan kueri cross apply terdistribusi.
Peningkatan pengurutan ulang
JOIN
.Meningkatkan performa kueri dengan klausa
IN (...)
yang besar.Meningkatkan performa
GROUP BY
dalam kasus tertentu.Peningkatan lainnya termasuk penanganan kueri yang lebih efisien dengan
LIMIT
, kunci asing, dan pemilihan indeks.
Versi 7: 22 Mei 2024 (default)
Menambahkan dukungan untuk pemilihan paket gabungan indeks berdasarkan biaya.
Menambahkan dukungan untuk pemilihan cerdas rencana pencarian versus pemindaian berdasarkan statistik untuk kueri yang tidak memiliki predikat yang dapat dicari untuk semua bagian kunci.
Menambahkan dukungan untuk pemilihan join hash berbasis biaya.
Versi 6: 11 September 2023
Peningkatan pendorongan batas dan pendorongan predikat melalui join luar penuh.
Estimasi kardinalitas dan model biaya yang ditingkatkan.
Mengaktifkan pengoptimalan berbasis biaya untuk kueri DML.
Versi 5: 15 Juli 2022
Meningkatkan model biaya untuk pemilihan indeks, pengelolaan distribusi, penempatan urutan, dan pemilihan
GROUP BY
.Menambahkan dukungan untuk pemilihan algoritma join berbasis biaya yang memilih antara hash dan join penerapan. Join penggabungan masih memerlukan penggunaan petunjuk kueri.
Menambahkan dukungan untuk komutabilitas join berbasis biaya.
Versi 4: 1 Maret 2022
Peningkatan pada pemilihan indeks sekunder.
- Meningkatkan penggunaan indeks sekunder dalam penggabungan antara tabel yang diselingi.
- Meningkatkan penggunaan indeks sekunder yang mencakup.
- Peningkatan pemilihan indeks saat statistik pengoptimal sudah tidak berlaku.
- Pilih indeks sekunder dengan predikat pada kolom utama yang diindeks meskipun statistik pengoptimal tidak tersedia atau melaporkan bahwa tabel dasar kecil.
Memperkenalkan join hash satu jalur, yang diaktifkan oleh petunjuk
hash_join_execution
baru.Petunjuk Gabung:
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 dari join hash besar. Join hash satu jalur diharapkan memiliki performa yang lebih baik saat Anda mengamati hal berikut di profil eksekusi kueri:
- Jumlah eksekusi pada turunan kanan hash join lebih besar daripada jumlah eksekusi pada operator hash join.
- Latensi pada turunan kanan operator hash join juga tinggi.
Secara default (
hash_join_execution=multi_pass
), jika input sisi build join hash terlalu besar untuk muat dalam memori, sisi build akan dibagi menjadi beberapa batch dan kita dapat memindai sisi probe beberapa kali. Dengan mode baru (hash_join_execution=one_pass
), join hash akan dialihkan ke disk jika input sisi build-nya tidak dapat muat 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 join baru, join penggabungan, yang diaktifkan menggunakan nilai petunjuk kueri JOIN METHOD baru.
Petunjuk laporan mutasi:
GoogleSQL
@{join_method=merge_join} SELECT ...
PostgreSQL
/*@ join_method=merge_join */ SELECT ...
Petunjuk bergabung:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=merge_join} (...)
PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=merge_join */ (...)
Menambahkan algoritma join baru, join hash siaran push, yang diaktifkan menggunakan nilai petunjuk kueri JOIN METHOD baru.
Petunjuk bergabung:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=push_broadcast_hash_join} (...)
PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=push_broadcast_hash_join} */ (...)
Memperkenalkan operator gabungan penggabungan terdistribusi, yang diaktifkan secara default jika berlaku. Operasi ini meningkatkan performa kueri.
Peningkatan kecil pada performa pemindaian di
GROUP BY
saat 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
c
meskipun tidak diperlukan oleh kueri.SELECT a, b FROM myTable GROUP BY a, b
Meningkatkan performa beberapa kueri dengan
LIMIT
jika ada operator cross apply yang diperkenalkan oleh join 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 dapat mencakup subkueri atau konstruksi struct melalui join. Hal ini meningkatkan performa kueri dengan 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, maka batas juga dapat didorong melalui join.
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_CONTAINS
danLIKE
dalam keadaan tertentu. - Meningkatkan performa pemindaian dalam
GROUP BY
dalam situasi tertentu.
Versi 1: 18 Juni 2019
Mencakup banyak pengoptimalan berbasis aturan seperti pushdown predikat, pushdown batas, join redundan, dan penghapusan ekspresi redundan, untuk beberapa nama.
Menggunakan statistik pada data pengguna untuk memilih indeks yang akan digunakan untuk mengakses setiap tabel.
Langkah selanjutnya
- Untuk mempelajari pengoptimal kueri lebih lanjut, lihat Tentang pengoptimal kueri.
- Untuk mengelola versi pengoptimal dan paket statistik untuk skenario Anda, lihat Mengelola pengoptimal kueri.