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