Di Spanner, fungsi, termasuk fungsi SQL bawaan dan fungsi yang ditentukan pengguna, diklasifikasikan berdasarkan volatilitasnya. Kategori volatilitas menunjukkan apakah fungsi menampilkan hasil yang sama saat Anda memanggilnya dengan argumen yang sama. Klasifikasi ini memengaruhi cara pengoptimal kueri menangani fungsi dan tempat Anda dapat menggunakan fungsi tersebut, seperti dalam ekspresi kolom yang dihasilkan atau definisi indeks. Memahami volatilitas fungsi membantu Anda menulis kueri dan skema yang lebih dapat diprediksi dan berperforma di Spanner.
Ada tiga kategori volatilitas, yang mirip dengan konsep dalam sistem seperti PostgreSQL:
Tidak dapat diubah: Fungsi bersifat tidak dapat diubah jika menampilkan hasil yang sama saat Anda memanggilnya dengan nilai argumen yang sama. Perilaku ini berarti hasil fungsi hanya bergantung pada argumen inputnya dan bukan pada status database, setelan sesi, atau faktor eksternal. Sebagian besar fungsi matematika tidak dapat diubah. Fungsi berikut adalah contohnya:
Fungsi pemformatan tanggal dan waktu dengan input eksplisit
Fungsi yang bergantung pada setelan yang dapat dikonfigurasi runtime, seperti zona waktu, tidak dapat diubah karena hasilnya dapat bervariasi di berbagai konfigurasi database atau sesi.
Stabil: Fungsi bersifat stabil jika menampilkan hasil yang sama untuk nilai argumen yang sama dalam satu eksekusi pernyataan. Namun, hasilnya dapat berubah di berbagai pernyataan SQL. Fungsi seperti
CURRENT_TIMESTAMP,CURRENT_DATE, dan fungsi berbasis waktu serupa bersifat stabil. Misalnya, beberapa panggilan keCURRENT_TIMESTAMPdalam pernyataanSELECTyang sama akan menghasilkan stempel waktu yang sama, tetapi pernyataan berikutnya mungkin menghasilkan stempel waktu yang berbeda.Volatil: Fungsi bersifat volatil jika nilainya dapat berubah meskipun dalam satu eksekusi pernyataan dengan argumen yang sama. Misalnya, fungsi
GENERATE_UUID, yang menghasilkan ID unik, bersifat volatil.
Implikasi volatilitas
Kategori volatilitas fungsi menentukan tempat fungsi dapat digunakan dalam skema database Anda dan cara kueri yang berisi fungsi dioptimalkan:
Kolom yang dihasilkan: Ekspresi yang menentukan kolom yang dihasilkan harus tidak dapat diubah. Hal ini memastikan bahwa nilai yang disimpan bersifat deterministik berdasarkan kolom lain dalam baris. Spanner akan menampilkan error jika Anda mencoba menentukan kolom yang dihasilkan dengan ekspresi yang tidak dapat diubah.
Pengindeksan: Anda tidak dapat membuat indeks pada ekspresi yang melibatkan fungsi volatil. Spanner akan menampilkan error jika Anda mencoba membuat indeks pada ekspresi yang melibatkan fungsi volatil.
Pengoptimalan kueri: Pengoptimal kueri menggunakan informasi volatilitas untuk melakukan pengoptimalan. Misalnya, pengoptimal kueri melakukan prakalkulasi panggilan ke fungsi yang tidak dapat diubah dengan argumen konstan. Pengoptimal sering kali menyimpan hasil fungsi stabil dalam cache dalam cakupan eksekusi satu pernyataan.