PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana kata kunci IMMUTABLE, STABLE, dan VOLATILE memengaruhi perilaku fungsi?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya harus mengimpor data dari CSV ke tabel Postgres menggunakan pgAdmin 3?

  2. HikariCP - koneksi tidak tersedia

  3. Melakukan WHERE IN pada beberapa kolom di Postgresql

  4. Bagaimana cara memperbaiki kesalahan ketidakcocokan versi pg_dump?

  5. Cara membersihkan SQL mentah di Rails 4