Cập nhật trong PostgreSQL 9.2
Có một cải tiến lớn, tôi trích dẫn ghi chú phát hành tại đây :
Câu trả lời ban đầu cho PostgreSQL 9.1 trở lên
Các hàm plpgsql có tác dụng tương tự như PREPARE
câu lệnh:các truy vấn được phân tích cú pháp và kế hoạch truy vấn được lưu vào bộ nhớ đệm.
Ưu điểm là một số chi phí được tiết kiệm cho mọi cuộc gọi.
Điểm bất lợi là kế hoạch truy vấn không được tối ưu hóa cho các giá trị tham số cụ thể mà nó được gọi.
Đối với các truy vấn trên bảng có phân phối dữ liệu đồng đều, điều này nói chung sẽ không có vấn đề gì và các hàm PL / pgSQL sẽ hoạt động nhanh hơn một chút so với các truy vấn SQL thô hoặc các hàm SQL. Nhưng nếu truy vấn của bạn có thể sử dụng các chỉ mục nhất định tùy thuộc vào các giá trị thực tế trong WHERE
hoặc nói chung hơn, đã chọn một kế hoạch truy vấn tốt hơn cho các giá trị cụ thể, bạn có thể kết thúc với một kế hoạch truy vấn phụ tối ưu. Hãy thử một hàm SQL hoặc sử dụng SQL động với EXECUTE
để buộc một truy vấn được lập kế hoạch lại cho mọi cuộc gọi. Có thể trông giống như sau:
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;
Chỉnh sửa sau khi nhận xét:
Nếu biến thể này không thay đổi thời gian thực hiện, thì phải có các yếu tố khác khi chơi mà bạn có thể đã bỏ qua hoặc không đề cập đến. Cơ sở dữ liệu khác nhau? Các giá trị tham số khác nhau? Bạn sẽ phải đăng thêm chi tiết.
Tôi thêm một trích dẫn từ hướng dẫn để sao lưu các tuyên bố ở trên của tôi: