Kata kuncinya IMMUTABLE
adalah tidak pernah ditambahkan secara otomatis oleh pgAdmin atau Postgres. Siapa pun yang membuat atau mengganti fungsi tersebut yang melakukannya.
volatilitas yang benar untuk fungsi yang diberikan adalah VOLATILE
(juga default), bukan STABLE
- atau tidak masuk akal untuk menggunakan clock_timestamp()
yaitu VOLATILE
berbeda dengan now()
atau CURRENT_TIMESTAMP
yang STABLE
:mereka mengembalikan stempel waktu yang sama dalam transaksi yang sama. Panduan:
clock_timestamp()
mengembalikan waktu aktual saat ini, dan oleh karena itu nilainya berubah bahkan dalam satu perintah SQL.
Manual memperingatkan bahwa volatilitas fungsi STABLE
...
tidak pantas untuk
AFTER
pemicu yang ingin meminta baris yang dimodifikasi oleh perintah saat ini.
.. karena evaluasi berulang dari fungsi pemicu dapat mengembalikan berbeda hasil untuk baris yang sama. Jadi, bukan STABLE
.
Anda bertanya:
Apakah Anda memiliki gagasan mengapa fungsi tersebut dikembalikan dengan benar lima kali sebelum tetap pada nilai kelima ketika ditetapkan sebagai
IMMUTABLE
?
Wiki Postgres:
Dengan 9.2, perencana akan menggunakan rencana khusus mengenai parameter yang dikirim (kueri akan direncanakan saat dieksekusi), kecuali jika kueri dieksekusi beberapa kali dan perencana memutuskan bahwa paket umum tidak terlalu mahal daripada paket khusus.
Penekanan saya yang berani. Tampaknya tidak masuk akal untuk IMMUTABLE
fungsi tanpa parameter masukan. Tapi label palsu ditimpa oleh VOLATILE
fungsi dalam tubuh (membatalkan fungsi sebaris ):rencana kueri yang berbeda masih bisa masuk akal.Terkait:
- Kinerja Prosedur Tersimpan PostgreSQL
Selain
trunc()
sedikit lebih cepat dari floor()
dan melakukan hal yang sama di sini, karena angka positif dijamin:
SELECT (trunc(EXTRACT(EPOCH FROM clock_timestamp()) * 10) - 13885344000)::int