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

sku*_*mar 25 postgresql optimization plpgsql functions explain

我在 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;
Run Code Online (Sandbox Code Playgroud)

如果我跑了EXPLAIN ANALYZE f1(),我只会得到总时间,但没有细节。有没有办法可以获得函数中所有查询的详细结果?

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

Erw*_*ter 26

EXPLAIN调用的正确语法需要一个SELECT. 你不能只在 SQL 中写出裸函数名:

EXPLAIN ANALYZE SELECT f1();
Run Code Online (Sandbox Code Playgroud)

优化

PL/pgSQL 函数是查询计划器的黑匣子。里面查询和其他查询一样进行了优化,但是像prepared statement一样,单独一个一个,执行计划可能会在会话期间被缓存。细节:

EXPLAIN 函数体

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

SET auto_explain.log_nested_statements = ON;
Run Code Online (Sandbox Code Playgroud)

详细说明:

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