微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL性能 – SELECT与存储功能

我正在尝试在Postgresql上创建一个存储函数来提高性能并存储大查询,并且只需在我的代码调用函数.

例如,如果我有一个功能

CREATE OR REPLACE FUNCTION test(max integer) 
RETURNS TABLE (id integer) AS $$
SELECT User.id
FROM User
LIMIT max; 
$$LANGUAGE sql STABLE;

调用这样的函数来查看查询的持续时间:

EXPLAIN ANALYZE SELECT test(10);

并且该函数比相同的原始SQL查询慢得多!我认为存储的函数将在创建时进行编译和优化.如果我尝试使用更大的查询,那么函数性能就太糟糕了.

我想我可能做错了什么!

谢谢,

解决方法

规划器的查询存在问题,因为它无法评估函数的执行时间.在这种情况下,规划器获取函数的估计执行成本,可以在create function …或alter function ….中定义.但是,如果您尝试此查询

explain analyse select * from test(10);

你会发现执行时间更加真实.

相比:

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)

与:

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)

注意两个最后计划的相似性.应该在FROM子句中调用函数(返回行集或表的函数,如本例所示).在某些条件下,它们可以内联.

阅读更多:Inlining of SQL functions.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐