PostgreSQL是否缓存函数调用?

12
假设我有一个稳定的 SQL 函数,它只接受一个参数(在内部,函数会在多个表上执行 SELECT 查询,但对于调用方而言,该函数只是一个黑盒)。
如果在同一条 SELECT 语句中多次使用相同的参数调用此函数,PostgreSQL 是否聪明到足够只实际调用一次并缓存结果?还是我需要手动使用 WITH 语句(通用表达式)进行缓存?

尝试使用CTE手动“缓存”它并不能保证不会多次调用它。即使在可以缓存过程调用的系统上,如果它执行表上的SQL,则通常也无法这样做 - 因为优化器可能没有很好的方法来判断是否已添加相关行到表中而不重新运行查询(此时它有答案...)。 - Clockwork-Muse
1
@Clockwork-Muse:这些考虑因素并不适用于Postgres,在那里单个查询的所有CTE都基于相同的快照 - 独立于并发事务。因此,是的,CTE(WITH查询)非常有用,可以避免重复执行。子查询也可以完成任务,而且通常更便宜。 - Erwin Brandstetter
1个回答

15

PostgreSQL没有针对稳定函数结果的缓存(也没有缓存任何函数结果)。PostgreSQL试图尽量减少调用次数,但它没有缓存。您可以通过更高的COST属性来惩罚这些调用。使用WITH可能是一个不错的主意。


这个答案在2020年仍然有效吗? - Radim Vansa
1
有一些补丁,但它们没有合并,我进行了一些简单的测试,我认为它仍然有效。 - Pavel Stehule
似乎在 14.1 上仍然有效,请参见此处的类似答案和讨论:https://dev59.com/an4QtIcB2Jgan1znwuVj#75231914 - Marmite Bomber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接