据我了解,当您向 Postgres 发送查询时,例如:
SELECT id FROM table1 WHERE name = $1;
Postgres 将创建一个查询计划。该计划将在同一会话中为同一查询缓存。但是如果你创建一个函数:
CREATE OR REPLACE FUNCTION get_table1 (parname text) RETURNS bigint
LANGUAGE plpgsql AS
$$BEGIN
RETURN (SELECT id FROM table1 where name = parname);
END$$;
查询计划将被缓存用于所有未来的会话。
我想通过检查查询分析器被调用的频率来验证这个理论。有没有办法检查 Postgres 解析查询的次数?
如果可能的话,我想监控每秒#parses 和 min/max/avg 解析持续时间之类的东西。
无法为“所有未来的会话”保存查询计划。查询计划只为当前会话保存。并且只有在一些有利条件下才能重复使用。
即席 SQL 查询的计划根本不保存。PL/pgSQL 函数中的所有查询都被视为准备好的语句。并且除了查询计划之外还有更多步骤。
值得注意的是,自 Postgres 9.1 以来发生了重大变化,通用计划更普遍地被保存并重用于 PL/pgSQL 中的语句。这在 pg 9.2 中变得更加智能。
手册(粗体强调我的):
这并没有说明查询计划,但是:
再往下:
如何判断是否使用通用计划?
保存的计划始终是通用计划,反之则不然。
准备好的语句保存在哪里?
PL/pgSQL 中 SQL 语句的查询计划
这些通常在
EXPLAIN
输出中不可见。您也可以安装附加模块auto-explain以将这些计划写入日志。详情在这里:有关PL/pgSQL 函数中计划缓存的详细信息,最好直接阅读手册。