Bạn có thể đạt được điều đó với một hàm SQL đơn giản. Tính năng chính là hàm generate_subscripts()
:
CREATE OR REPLACE FUNCTION f_attendance(_arr2d int[])
RETURNS SETOF attendance AS
$func$
SELECT a.*
FROM generate_subscripts($1, 1) i
JOIN attendance a ON a.class = $1[i][1]
AND a.section = $1[i][2]
$func$ LANGUAGE ROWS 10 sql STABLE;
Gọi:
SELECT * FROM f_attendance(ARRAY[[1,1],[2,2]]);
Hoặc tương tự với mảng chữ - thuận tiện hơn trong một số ngữ cảnh, đặc biệt là với các câu lệnh chuẩn bị sẵn:
SELECT * FROM f_attendance('{{1,1},{2,2}}');
Chức năng luôn luôn mong đợi một mảng 2D. Ngay cả khi bạn vượt qua một cặp duy nhất, hãy lồng ghép nó:
SELECT * FROM f_attendance('{{1,1}}');
Kiểm tra việc triển khai của bạn
-
Bạn đã tạo hàm
VOLATILE
, nhưng nó có thể làSTABLE
. Theo tài liệu:Do hành vi chụp nhanh này, một hàm chỉ chứa
SELECT
các lệnh có thể được đánh dấu một cách an toànSTABLE
.Có liên quan:
- Cách chuyển một tham số vào một hàm ngày tháng
-
Bạn cũng sử dụng
LANGUAGE plpgsql
thay vìsql
, điều này có ý nghĩa nếu bạn thực thi hàm nhiều lần trong cùng một phiên. Nhưng sau đó bạn cũng phải làm cho nóSTABLE
hoặc bạn mất lợi ích hiệu suất tiềm năng đó. Hướng dẫn sử dụng một lần nữa:STABLE
vàIMMUTABLE
các hàm sử dụng ảnh chụp nhanh được thiết lập kể từ khi bắt đầu truy vấn gọi, trong khi các hàm VOLATILE lấy ảnh chụp mới ở đầu mỗi truy vấn mà chúng thực thi. -
EXPLAIN
của bạn đầu ra hiển thị Chỉ quét chỉ mục , không phải quét tuần tự như bạn nghi ngờ trong nhận xét của mình. -
Cũng có một bước sắp xếp trong
EXPLAIN
của bạn đầu ra không khớp với mã bạn hiển thị. Bạn có chắc là mình đã sao chép đúngEXPLAIN
không sản lượng? Làm thế nào bạn có được nó dù sao? Các hàm PL / pgSQL là hộp đen đểEXPLAIN
. Bạn có sử dụngauto_explain
không ? Chi tiết:- Kế hoạch truy vấn postgres của một lời gọi UDF được viết bằng pgpsql
-
Công cụ lập kế hoạch truy vấn Postgres không biết tham số được truyền sẽ có bao nhiêu phần tử mảng, vì vậy rất khó lập kế hoạch cho truy vấn và nó có thể mặc định là quét tuần tự (tùy thuộc vào nhiều yếu tố hơn). Bạn có thể trợ giúp bằng cách khai báo số hàng dự kiến. Nếu bạn thường không có nhiều hơn 10 mục, hãy thêm
ROWS 10
như tôi đã làm ở trên. Và kiểm tra lại.