Halaman ini menjelaskan pengoptimal kueri Spanner dan manfaatnya.
Ringkasan
Pengoptimal kueri SQL Spanner mengonversi pernyataan SQL deklaratif, yang mendeskripsikan data yang diinginkan kueri, menjadi rencana eksekusi imperatif, yang menjelaskan suatu cara untuk mendapatkan data tersebut secara tepat. Proses transformasi pernyataan deklaratif menjadi rencana eksekusi kueri melibatkan transformasi ke struktur hierarki yang digunakan untuk merepresentasikan kueri. Pengoptimal, dalam proses menghasilkan rencana eksekusi, mempertahankan makna logis kueri SQL asli sehingga baris yang benar ditampilkan.
Peran penting lainnya dari pengoptimal adalah menghasilkan rencana eksekusi yang efisien.
Bagaimana pengoptimal Spanner menghasilkan rencana eksekusi yang efisien?
Pengoptimal Spanner menggunakan kombinasi heuristik yang andal dan pengoptimalan berbasis biaya untuk menghasilkan rencana yang efisien. Beberapa heuristik sangat mudah, seperti "melakukan filter pada mesin jarak jauh, bukan mengambil data ke mesin lokal". Heuristik lainnya lebih kompleks, tetapi tetap menerapkan prinsip pemindahan logika yang mengurangi volume data lebih dekat dengan data. Prinsip tersebut sangat penting dalam sistem yang melakukan sharding data di beberapa mesin.
Tidak semua keputusan eksekusi dapat dibuat secara efektif menggunakan aturan tetap tersebut, sehingga
optimizer juga membuat keputusan berdasarkan perkiraan
biaya alternatif. Estimasi biaya tersebut dihitung menggunakan struktur kueri, skema database, dan estimasi volume data yang akan dihasilkan oleh fragmen kueri. Misalnya, Spanner
akan memperkirakan jumlah baris tabel Lagu yang memenuhi syarat filter
SongGenre = "Country"
jika filter tersebut muncul dalam kueri. Untuk membantu
komputasi estimasi tersebut, Spanner secara berkala mengumpulkan
statistik untuk mengkarakterisasi distribusi data dalam database.
Selain itu, Spanner mengoptimalkan eksekusi kueri dengan menentukan secara otomatis apakah metode pemrosesan berorientasi baris atau kolom harus digunakan untuk kueri tersebut. Untuk mengetahui informasi selengkapnya, lihat Mengoptimalkan pemindaian.
Untuk mempelajari lebih lanjut rencana eksekusi kueri dan cara penggunaannya oleh Spanner untuk menjalankan kueri di lingkungan terdistribusi, lihat Rencana eksekusi kueri.
Pembuatan versi pengoptimal kueri
Seiring waktu, pengoptimal kueri Spanner akan berkembang, sehingga memperluas kumpulan pilihan dalam rencana eksekusi kueri dan meningkatkan akurasi perkiraan yang menjadi dasar pilihan tersebut, sehingga menghasilkan rencana eksekusi kueri yang lebih efisien.
Spanner merilis update pengoptimal sebagai versi pengoptimal kueri baru untuk meningkatkan efisiensi rencana eksekusi kuerinya. Untuk mempelajari lebih lanjut tentang berbagai versi, lihat versi pengoptimal kueri Spanner.
Paket statistik pengoptimal kueri
Spanner mempertahankan statistik tentang distribusi data kolom tabel untuk membantu memperkirakan jumlah baris yang akan dihasilkan oleh kueri. Pengoptimal kueri menggunakan estimasi ini untuk membantu memilih rencana eksekusi kueri terbaik. Statistik ini diperbarui secara berkala oleh Spanner. Karena statistik digunakan untuk memilih rencana eksekusi kueri, saat statistik diperbarui, Spanner dapat mengubah paket kueri yang digunakan untuk kueri.
Secara default, database secara otomatis menggunakan paket statistik yang terakhir dibuat. Anda dapat menyematkan database ke versi paket statistik sebelumnya. Anda juga memiliki opsi untuk menjalankan setiap kueri dengan paket statistik selain yang terbaru.
Membuat paket statistik baru
Spanner akan otomatis membuat paket statistik baru setiap tiga hari. Untuk membuat paket statistik baru secara manual, gunakan
pernyataan DDL ANALYZE
GoogleSQL atau pernyataan DDL
ANALYZE
PostgreSQL.
Setelah perubahan signifikan pada data atau skema database Anda, pembuatan paket statistik baru dapat menguntungkan performa kueri. Sebagai praktik terbaik, buat paket statistik baru jika hal berikut terjadi:
- Database memproses penyisipan, pembaruan, atau penghapusan dalam jumlah besar.
- Anda menambahkan indeks baru ke database.
- Anda menambahkan kolom baru ke tabel.
Menjalankan pernyataan DDL ANALYZE
akan memperbarui skema Anda, dan memulai
operasi yang berjalan lama.
Setelah Spanner selesai menjalankan pernyataan, perlu waktu hingga sepuluh menit bagi pengoptimal kueri untuk memperhitungkan paket statistik baru dalam perencanaan kuerinya.
Pembersihan sampah memori dari paket statistik
Paket statistik di Spanner disimpan selama 30 hari sejak dibuat, setelah itu akan dilakukan pembersihan sampah memori.
Tabel INFORMATION_SCHEMA.SPANNER_STATISTICS
bawaan Spanner berisi daftar paket statistik yang tersedia. Setiap baris dalam tabel ini
mencantumkan paket statistik berdasarkan nama, dan namanya berisi stempel waktu pembuatan
paket yang ditentukan. Setiap entri juga berisi kolom yang disebut ALLOW_GC
yang
menentukan apakah paket dapat dibersihkan sebagai sampah memori atau tidak.
Anda dapat menyematkan seluruh database ke salah satu paket yang tercantum dalam tabel tersebut. Paket statistik yang disematkan tidak akan dibersihkan sampah memorinya dan nilai
ALLOW_GC
akan diabaikan selama database disematkan ke paket ini. Untuk menggunakan
paket statistik tertentu untuk setiap kueri, paket harus
dicantumkan dengan ALLOW_GC=FALSE
atau disematkan. Hal ini mencegah kueri gagal setelah
paket statistik dibersihkan dari sampah memori. Anda dapat mengubah nilai
ALLOW_GC
menggunakan pernyataan DDL ALTER STATISTICS
GoogleSQL atau
ALTER STATISTICS
PostgreSQL.
Retensi paket dan Informasi Identitas Pribadi (PII)
Paket statistik berisi histogram data kolom, sesuai dengan praktik industri standar. Hal ini membantu pengoptimal kueri memilih rencana kueri yang optimal. Histogram dibuat menggunakan sampel kecil nilai. Set data kecil ini berpotensi berisi PII.
Spanner membuat paket statistik baru secara teratur dan mempertahankannya selama 30 hari secara default. Dengan demikian, sampel kecil nilai yang dihapus dari database dapat dipertahankan selama 30 hari tambahan dalam histogram statistik.
Paket statistik yang disematkan dengan opsi database optimizer_statistics_package
atau paket dengan opsi ALLOW_GC=FALSE
tidak akan dibersihkan sampah memorinya.
Histogram dalam paket ini dapat berisi nilai yang dihapus dari database untuk
periode yang lebih lama. Selain itu, konten paket statistik disertakan dalam cadangan database.
Statistik pengoptimal disimpan dengan dienkripsi dengan cara yang sama seperti data pengguna.
Jumlah total penyimpanan yang diperlukan untuk paket ini biasanya kurang dari 100 MB, dan diperhitungkan terhadap total biaya penyimpanan Anda.
Langkah selanjutnya
- Untuk mempelajari histori pengoptimal kueri lebih lanjut, lihat Histori versi pengoptimal kueri.
- Untuk mengelola versi pengoptimal dan paket statistik untuk skenario Anda, lihat Mengelola pengoptimal kueri.