PostgreSQL性能 – SELECT与存储功能
发布时间:2020-12-13 16:04:17 所属栏目:百科 来源:网络整理
导读:我正在尝试在PostgreSQL上创建一个存储函数来提高性能并存储大查询,并且只需在我的代码中调用该函数. 例如,如果我有一个功能: CREATE OR REPLACE FUNCTION test(max integer) RETURNS TABLE (id integer) AS $$SELECT User.idFROM UserLIMIT max; $$LANGUAG
我正在尝试在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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |