带有函数 wrap sql 的 postgresql 这么慢?
postgresql with function wrap sql so slow?
首先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
为什么使用函数换行这么慢?
尝试使用 "immutable" 替换 "stable" 但结果是一样的!
额外费用必须是由于您在 SELECT
子句而不是 FROM
子句中使用集合返回函数。
请注意,SELECT
子句中设置返回函数的处理在 PostgreSQL v10 中发生了变化,因此您的版本可能会影响此行为。
首先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
为什么使用函数换行这么慢?
尝试使用 "immutable" 替换 "stable" 但结果是一样的!
额外费用必须是由于您在 SELECT
子句而不是 FROM
子句中使用集合返回函数。
请注意,SELECT
子句中设置返回函数的处理在 PostgreSQL v10 中发生了变化,因此您的版本可能会影响此行为。