Người lập kế hoạch gặp sự cố với truy vấn của bạn vì nó không thể đánh giá thời gian thực thi của hàm. Trong trường hợp này, người lập kế hoạch nhận được chi phí thực thi ước tính của hàm, có thể được xác định trong create function...
hoặc alter function...
. Tuy nhiên, nếu bạn thử truy vấn này:
explain analyse select * from test(10);
bạn sẽ thấy thời gian thực hiện thực tế hơn nhiều.
So sánh:
test=# explain analyse select test(1000);
QUERY PLAN
------------------------------------------------------------------------------------------
Result (cost=0.00..5.25 rows=1000 width=0) (actual time=0.830..1.220 rows=1000 loops=1)
Planning time: 0.038 ms
Execution time: 1.250 ms
(3 rows)
so với:
test=# explain analyse select * from test(1000);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..37.42 rows=1000 width=4) (actual time=0.006..0.124 rows=1000 loops=1)
-> Seq Scan on test_table (cost=0.00..2560.28 rows=68428 width=4) (actual time=0.005..0.102 rows=1000 loops=1)
Planning time: 0.130 ms
Execution time: 0.144 ms
(4 rows)
test=# explain analyse select * from test_table limit 1000;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..37.42 rows=1000 width=269) (actual time=0.009..0.118 rows=1000 loops=1)
-> Seq Scan on test_table (cost=0.00..2560.28 rows=68428 width=269) (actual time=0.008..0.097 rows=1000 loops=1)
Planning time: 0.076 ms
Execution time: 0.151 ms
(4 rows)
Lưu ý sự giống nhau của hai kế hoạch cuối cùng. Các hàm bảng (các hàm trả về tập hợp các hàng hoặc bảng như trong trường hợp này) phải được gọi trong FROM
mệnh đề. Trong những điều kiện nhất định, chúng có thể được nội tuyến.
Đọc thêm: Nội tuyến của các hàm SQL .