带有函数包装sql的postgresql这么慢?

时间:2018-11-12 10:15:56

标签: sql postgresql query-performance stored-functions

第一个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

为什么使用功能包装太慢?

尝试使用“不可变”替换“稳定”,但结果相同!

1 个答案:

答案 0 :(得分:0)

额外的费用一定是由于您在SELECT子句中而非在FROM子句中使用了set returning函数。

请注意,SELECT子句中的集合返回函数的处理在PostgreSQL v10中已更改,因此您的版本可能会影响此行为。