Versi pengoptimal kueri Spanner

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 dan LIKE 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