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)可能是“内联的”,即函数代码被插入到外部查询中,并且一切都像没有函数一样开始执行。在这种情况下,查询计划包括详细信息。