PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tại sao PostgreSQL xử lý truy vấn của tôi khác nhau trong một hàm?

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để sửa chuỗi F Python trong truy vấn của tôi để không dễ bị chèn SQL?

  2. Tập lệnh PHP \ HTML để tự động điền các trường biểu mẫu khi một mục được chọn từ danh sách thả xuống

  3. PostgreSQL 11 - Thủ tục

  4. Postgresql thay đổi loại cột từ int thành UUID

  5. Nhóm các hàng hàng giờ bằng Django