甚至不需要CTE。一个 普通的子查询 也可以完成这项工作(已在9.3版中进行了测试):
SELECt i, (f).* -- decompose hereFROM ( SELECt i, (slow_func(i)) AS f -- do not decompose here FROM generate_series(1, 3) i ) sub;
确保不要在子查询中分解函数的复合结果。将其保留给 外部查询 。
当然需要一个众所周知的类型。无法使用匿名记录。
或者说,什么@Richard写道,一个 LATERALJOIN
作品了。语法可以更简单:
SELECt * FROM generate_series(1, 3) i, slow_func(i) f
LATERAL
在Postgres 9.3或更高版本中隐式应用。- 函数可以在
FROM
子句中独立存在,而不必包装在其他子选择中。试想一下在其位置上有一张桌子。
SQL Fiddle 具有
EXPLAINVERBOSE所有变体的输出。如果发生该功能,您可以 看到 对该功能的多次评估。
COST
环境
通常,(对于此特定查询无关紧要),请确保对您的函数应用高成本设置,因此计划者会知道避免进行更多必要的评估。喜欢:
CREATE OR REPLACE FUNCTION slow_function(int) RETURNS result_t AS$func$ -- expensive body$func$ LANGUAGE sql IMMUTABLE **COST 100000** ;
每个文档:
较大的值会使计划人员尝试避免不必要地评估函数。



