首先用sql解释一下分析:
explain analyse select * from ttq.ttq_post; Seq Scan on ttq_post (cost=10000000000.00..10000000014.71 rows=171 width=547) (actual time=0.005..0.027 rows=176 loops=1) Planning Time: 0.033 ms Execution Time: 0.041 ms
但是如果使用函数包装相同的SQL, 例如:
create or replace function ttq.test_fn_slow() returns setof ttq.ttq_post language sql stable as $$ select * from ttq.ttq_post; $$
和执行打击功能:
explain analyse select ttq.test_fn_slow();
结果:
ProjectSet (cost=0.00..5.27 rows=1000 width=32) (actual time=0.063..0.175 rows=176 loops=1) -> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.001 rows=1 loops=1) Planning Time: 0.013 ms Execution Time: 0.192 ms
为什么用函数包装这么慢?
尝试使用“不可变”替换“稳定”,但结果是一样的!
额外的费用必须归因于您在SELECT子句中而不是在FROM子句中使用了set returning函数。
SELECT
FROM
请注意,SELECT在PostgreSQL v10中子句中对返回集合函数的处理已更改,因此您的版本可能会影响此行为。