Versi pengoptimal kueri Spanner

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 LIMIT di atas penerapan.

  • Memilih paket gabungan indeks secara lebih agresif.

  • Meningkatkan performa GROUP BY dengan 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 WITH dipertimbangkan 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 BY dalam 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 BY jika 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 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_CONTAINS dan LIKE dalam keadaan tertentu.
  • Meningkatkan performa pemindaian di bawah GROUP BY dalam 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