Các hàm PL / PGQuery và SQL đơn giản đều là một phần của bộ công cụ lớn hơn và nên được xem trong ngữ cảnh đó. Tôi có xu hướng nghĩ về nó theo thang đo sức mạnh tăng dần phù hợp với độ phức tạp và chi phí tăng dần, trong đó bạn nên sử dụng công cụ đơn giản nhất sẽ làm tốt công việc:
- Sử dụng chế độ xem nếu có thể
- Trường hợp một khung nhìn không phù hợp, hãy sử dụng hàm SQL
- Khi một hàm SQL không phù hợp, hãy sử dụng PL / PGQuery.
- Trong trường hợp PL / PGQuery quá hạn chế hoặc không đủ biểu cảm, hãy sử dụng PL / Perl, PL / Python, PL / V8, PL / Java hoặc bất cứ điều gì bạn thích
- ... Và khi không có PL sẽ thực hiện công việc, hãy sử dụng một chương trình bên ngoài và có thể
LISTEN
và NOTIFY
để nói chuyện với nó.
Rất thường xuyên một khung nhìn là đủ khi bạn nghĩ rằng một chức năng là cần thiết. Ngay cả khi nó cực kỳ đắt đối SELECT
với toàn bộ chế độ xem, WHERE
các mệnh đề trong truy vấn tham chiếu chế độ xem thường được đẩy xuống chế độ xem và có thể dẫn đến các gói truy vấn rất khác nhau. Tôi thường có những cải tiến hiệu suất lớn từ việc chuyển đổi các hàm SQL thành dạng xem.
Thời gian chính bạn thấy bạn không thể sử dụng chế độ xem và nên xem xét hàm SQL là khi:
- Các tham số không thể được biểu thị dưới dạng
WHERE
các mệnh đề đơn giản là cần thiết, như một tham số trong WITH
biểu thức
- Bạn muốn có một rào cản bảo mật thông qua một
SECURITY DEFINER
chức năng và các security_barrier
khung nhìn trong PostgreSQL 9.2 trở lên không đủ cho nhu cầu của bạn;
- Bạn cần các tham số không bị đẩy xuống các mệnh đề phụ của chế độ xem bởi trình tối ưu hóa và muốn kiểm soát trực tiếp hơn; hoặc là
- Có rất nhiều thông số hoặc có rất nhiều sự lặp lại của các thông số, vì vậy việc viết truy vấn dưới dạng xem là không thực tế.
Đối với hầu hết các tác vụ đó, một hàm SQL đơn giản hoạt động tốt và thường dễ đọc hơn PL / PGQuery. Các hàm SQL được khai báo STABLE
hoặc IMMUTABLE
(và cũng không được khai báo STRICT
hoặc SECURITY DEFINER
) cũng có thể được nội tuyến trong câu lệnh gọi. Điều đó giúp loại bỏ chức năng gọi qua chức năng và đôi khi cũng có thể mang lại lợi ích hiệu năng rất lớn khi điều kiện WHERE trong chức năng gọi được trình tối ưu hóa đưa vào chức năng SQL. Sử dụng các hàm SQL bất cứ khi nào chúng đủ cho nhiệm vụ.
Các hàm SQL thời gian chính sẽ không thực hiện công việc là khi bạn cần nhiều logic. Nếu / sau đó / các hoạt động khác mà bạn không thể biểu thị dưới dạng các CASE
câu lệnh, sử dụng lại nhiều kết quả được tính toán, xây dựng các giá trị từ khối, xử lý lỗi, v.v. PL / PGQuery sẽ có ích. Chọn PL / PGQuery khi bạn không thể sử dụng các hàm SQL hoặc chúng không phù hợp, như:
- SQL động và DDL động thông qua
EXECUTE
câu lệnh
- Khi bạn muốn
RAISE
lỗi / cảnh báo cho nhật ký hoặc máy khách
- Khi bạn cần xử lý ngoại lệ - bạn có thể bẫy và xử lý lỗi với
EXCEPTION
các khối thay vì toàn bộ giao dịch bị chấm dứt do lỗi
- Logic điều kiện phức tạp không phù hợp
CASE ... WHEN
lắm
- Rất nhiều lần sử dụng lại các giá trị được tính toán mà bạn không thể phù hợp với
WITH
và CTE
- Xây dựng hồ sơ năng động
- Bạn cần thực hiện một hành động sau khi tạo tập kết quả
Với các biểu thức bảng chung (CTE), đặc biệt là các CTE có thể ghi và WITH RECURSIVE
tôi thấy tôi sử dụng PL / PGQuery ít hơn nhiều so với trước đây vì SQL biểu cảm và mạnh mẽ hơn nhiều. Tôi sử dụng các khung nhìn và các hàm SQL đơn giản hơn rất nhiều bây giờ. Điều đáng ghi nhớ là các hàm SQL đơn giản có thể chứa nhiều hơn một câu lệnh; câu lệnh cuối cùng là kết quả của hàm.