Hàm SQL
... là lựa chọn tốt hơn:
-
Đối với truy vấn vô hướng đơn giản . Không có nhiều thứ để lập kế hoạch, tốt hơn là tiết kiệm mọi chi phí.
-
Đối với một cuộc gọi (hoặc rất ít) mỗi phiên . Không có gì để đạt được từ bộ nhớ đệm kế hoạch thông qua các câu lệnh đã chuẩn bị sẵn mà PL / pgSQL phải cung cấp. Xem bên dưới.
-
Nếu chúng thường được gọi trong ngữ cảnh của các truy vấn lớn hơn và đủ đơn giản để được nội tuyến .
-
Vì thiếu kinh nghiệm với bất kỳ ngôn ngữ thủ tục nào như PL / pgSQL. Nhiều người biết rõ về SQL và đó là tất cả những gì bạn cần cho các hàm SQL. Ít ai có thể nói như vậy về PL / pgSQL. (Mặc dù nó khá đơn giản.)
-
Mã ngắn hơn một chút. Không có chi phí khối.
Hàm PL / pgSQL
... là lựa chọn tốt hơn:
-
Khi bạn cần bất kỳ yếu tố thủ tục nào hoặc biến hiển nhiên là không có sẵn trong các hàm SQL.
-
Đối với bất kỳ loại SQL động nào , nơi bạn xây dựng và
EXECUTE
câu lệnh động. Cần chú ý đặc biệt để tránh SQL injection. Thêm chi tiết:- Các hàm postgres so với các truy vấn đã chuẩn bị trước
-
Khi bạn có tính toán có thể được tái sử dụng ở một số nơi và CTE không thể được kéo dài cho mục đích. Trong một hàm SQL, bạn không có biến và sẽ bị buộc phải tính toán nhiều lần hoặc ghi vào bảng. Câu trả lời liên quan này trên dba.SE có ví dụ mã song song để giải quyết vấn đề tương tự bằng cách sử dụng một hàm SQL / một hàm plpgsql / một truy vấn với CTE:
- Cách chuyển một tham số vào một hàm
Các bài tập có phần đắt hơn so với các ngôn ngữ thủ tục khác. Điều chỉnh phong cách lập trình không sử dụng nhiều nhiệm vụ hơn mức cần thiết.
-
Khi một hàm không thể được nội dòng và được gọi lặp đi lặp lại. Không giống như các hàm SQL, kế hoạch truy vấn có thể được lưu vào bộ nhớ đệm cho tất cả các câu lệnh SQL bên trong một hàm PL / pgSQL; chúng được coi như tuyên bố chuẩn bị sẵn sàng , kế hoạch được lưu vào bộ nhớ cache cho các cuộc gọi lặp lại trong cùng một phiên (nếu Postgres mong đợi kế hoạch được lưu trong bộ nhớ cache (chung) hoạt động tốt hơn so với việc lập kế hoạch lại mọi lúc. Đó là lý do tại sao các hàm PL / pgSQL thường nhanh hơn sau một vài cuộc gọi đầu tiên trong những trường hợp như vậy.
Đây là một chủ đề về pgsql-performance thảo luận về một số mặt hàng sau:
- Các hàm Re:pl / pgsql hoạt động tốt hơn các hàm sql?
-
Khi bạn cần bẫy lỗi .
-
Đối với chức năng kích hoạt .
-
Khi bao gồm các câu lệnh DDL thay đổi đối tượng hoặc thay đổi danh mục hệ thống theo bất kỳ cách nào có liên quan đến các lệnh tiếp theo - bởi vì tất cả các câu lệnh trong các hàm SQL được phân tích cú pháp cùng một lúc trong khi các hàm PL / pgSQL lập kế hoạch và thực thi từng câu lệnh một cách tuần tự (giống như một câu lệnh đã chuẩn bị). Xem:
- Tại sao các hàm PL / pgSQL có thể có tác dụng phụ trong khi các hàm SQL thì không?
Cũng xem xét:
- Hiệu suất thủ tục được lưu trữ PostgreSQL
Để thực sự trở lại từ một hàm PL / pgSQL, bạn có thể viết:
CREATE FUNCTION f2(istr varchar)
RETURNS text AS
$func$
BEGIN
RETURN 'hello! '; -- defaults to type text anyway
END
$func$ LANGUAGE plpgsql;
Có những cách khác:
- Tôi có thể đặt hàm plpgsql trả về số nguyên mà không cần sử dụng biến không?
- Hướng dẫn về "Quay lại từ một chức năng"