EXPLAIN ANALYZE不显示plpgsql函数内部查询的详细信息


18

我在PostgreSQL 9.3中使用PL / pgSQL函数,内部有几个复杂的查询:

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;

如果我跑步了EXPLAIN ANALYZE f1(),我只会得到总时间,而没有详细信息。有没有一种方法可以获取该函数中所有查询的详细结果?

如果Postgres不应该优化函数中的查询,我也要寻求解释。


2
auto_explain.log_nested_statements可能有帮助。参见postgresql.org/docs/9.3/static/auto-explain.html
DanielVérité2014年

Answers:


15

首先,正确的EXPLAIN调用语法需要使用SELECT。您不能只在SQL中编写裸函数名称:

EXPLAIN ANALYZE SELECT f1();

优化

PL / pgSQL函数是查询计划程序的黑匣子。像其他查询一样,对内部查询进行了优化,但是像准备好的语句一样分别进行了逐一优化,并且可以在会话期间缓存执行计划。细节:

EXPLAIN 功能体

就像@Daniel已经评论一样,您可以使用附加模块auto_explain获取更多详细信息(许多详细信息)。plpgsql函数内部的语句被视为“嵌套语句”。请务必设定

SET auto_explain.log_nested_statements = ON

详细说明:

作为规则的例外,非常简单的SQL函数(不是plpgsql)可以“内联”,即,将函数代码插入到外部查询中,并且一切都像没有开始的函数一样执行。在这种情况下,查询计划包括详细信息。


启用如下所示的“ auto_explain”后,加载“ auto_explain”;设置auto_explain.log_min_duration = 0; 设置auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; 我在日志文件'2014-12-08 18:21:59 IST日志以下得到消息:无法从客户端接收数据:无法建立连接,因为目标计算机主动拒绝了它'任何人都可以指导我吗实际问题....
skumar

注意:仅运行plpgsql函数后,我在日志文件中的信息已超过msg。
skumar 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.