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

Mengapa PostgreSQL memperlakukan kueri saya secara berbeda dalam suatu fungsi?

Pembaruan di PostgreSQL 9.2

Ada peningkatan besar, saya mengutip catatan rilis di sini :

Jawaban asli untuk PostgreSQL 9.1 atau lebih lama

Fungsi plpgsql memiliki efek yang mirip dengan PREPARE pernyataan:kueri diuraikan dan rencana kueri di-cache.

Keuntungannya adalah beberapa overhead disimpan untuk setiap panggilan.
Kerugiannya adalah rencana kueri tidak dioptimalkan untuk nilai parameter tertentu yang dipanggil.

Untuk kueri pada tabel dengan distribusi data yang merata, ini umumnya tidak akan menjadi masalah dan fungsi PL/pgSQL akan bekerja lebih cepat daripada kueri SQL mentah atau fungsi SQL. Tetapi jika kueri Anda dapat menggunakan indeks tertentu tergantung pada nilai aktual di WHERE klausa atau, lebih umum, memilih rencana kueri yang lebih baik untuk nilai tertentu, Anda mungkin berakhir dengan rencana kueri yang kurang optimal. Coba fungsi SQL atau gunakan SQL dinamis dengan EXECUTE untuk memaksa kueri direncanakan ulang untuk setiap panggilan. Bisa terlihat seperti ini:

CREATE OR REPLACE FUNCTION pie(id_param integer)
RETURNS SETOF record AS
$BODY$
BEGIN        
    RETURN QUERY EXECUTE
        'SELECT *
         FROM   table_name
         where  id = $1'
    USING id_param;
END
$BODY$
LANGUAGE plpgsql STABLE;

Edit setelah komentar:

Jika varian ini tidak mengubah waktu eksekusi, pasti ada faktor lain yang mungkin Anda lewatkan atau tidak sebutkan. Basis data yang berbeda? Nilai parameter yang berbeda? Anda harus memposting lebih banyak detail.

Saya menambahkan kutipan dari manual untuk mendukung pernyataan saya di atas:




  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 bisa memasukkan data umum ke tabel temp dari skema yang berbeda?

  2. Gabungkan beberapa baris menjadi satu dengan lebih dari satu nilai baris dalam satu kolom

  3. Ubah nama kolom tabel menjadi huruf besar di postgres

  4. server simpul tidak dapat terhubung ke postgres db

  5. Ubah fungsi rekursif menjadi tampilan