Fungsi Postgres dideklarasikan dengan klasifikasi volatilitas VOLATILE
, STABLE
atauIMMUTABLE
. Proyek ini dikenal sangat ketat dengan label ini untuk fungsi bawaan. Dan dengan alasan yang bagus. Contoh yang menonjol: indeks ekspresi hanya memungkinkan IMMUTABLE
fungsi dan yang harus benar-benar berubah untuk menghindari hasil yang salah.
Fungsi yang ditentukan pengguna masih bebas untuk dinyatakan sesuai keinginan pemilik. Manual menyarankan:
Untuk hasil optimalisasi terbaik, Anda harus memberi label fungsi Anda dengan kategori volatilitas paling ketat yang berlaku untuknya.
... dan menambahkan daftar luas hal-hal yang dapat salah dengan label volatilitas yang salah.
Namun, ada beberapa kasus di mana memalsukan ketidakberdayaan masuk akal. Sebagian besar ketika Anda tahu fungsinya, pada kenyataannya, tidak berubah dalam lingkup Anda. Contoh:
Selain semua implikasi yang mungkin terjadi pada integritas data , apa efeknya terhadap kinerja? Orang mungkin berasumsi bahwa mendeklarasikan fungsi IMMUTABLE
hanya dapat bermanfaat bagi kinerja . Apakah begitu?
Bisakah mendeklarasikan volatilitas fungsi IMMUTABLE
merusak kinerja?
Mari kita asumsikan Postgres 10 saat ini untuk mempersempitnya, tetapi semua versi terbaru menarik.
FORCE
seharusnya membuat indeks ekspresi menerima fungsi yang tidak dapat diubah (sambil menandainya sebagai titik kegagalan potensial). Ya, itu akan tampak seperti solusi yang lebih elegan daripada pembungkus fungsi yang tidak berubah.
FORCE
keduanya. 100% dari DBA PostgreSQL berpengalaman berbohong untuk mengerjakan UI itu dengan fungsi wrapper. Setidaknya denganFORCE
, kita tidak perlu pembungkus dan kita tidak perlu berbohong pada volatilitas yang diumumkan.