我正在运行PostgreSQL 9.2.1并且有一个返回3列的plpgsql函数。它被称为这样(简化):
SELECT (my_function(b.input)).*, a.other, b.columns
FROM table_a a
JOIN table_b b ON a.id = b.id
WHERE ...
该功能打印出警告信息,我惊讶地发现它打印了3次。看起来这个函数被调用了3次 - 大概每次调用一次。这对性能不利!我怎样才能确保它只被调用一次?它已经标记为STABLE。
如果我将其称为
SELECT * FROM my_function(input)
然后警告只打印一次,但我不知道如何将其集成到更大的查询中,并返回连接和其他列。也就是说,当我在FROM列表中需要其他表时,我不知道如何将函数放入FROM列表中,并且函数从那些表中获取输入。
修改:
查询(更接近原始版本):
SELECT (my_aggregate_function(sub1.border, sub1.lower_limit, sub1.upper_limit, operation)).*
FROM
(
SELECT (my_function(ca.timeslice_id)).*, agc.operation
FROM geometry_component agc
JOIN volume av ON agc.volume_id = av.id
JOIN volume_dependency avd ON av.contributor_id = avd.id
JOIN my_rowset_function('2013-02-22') ca ON avd.id = ca.feature_id
WHERE agc.timeslice_id = 12345
ORDER BY agc.sequence
) sub1
my_aggregate_function
和my_function
各返回3列(border,lower_limit,upper_limit),但my_aggregate_function
是聚合,my_function
是常规函数。
答案 0 :(得分:2)
这应该做的工作:
SELECT (y).*
FROM (
SELECT my_aggregate_function(border, lower_limit, upper_limit, operation) AS y
FROM (
SELECT (x).*, operation
FROM (
SELECT my_function(ca.timeslice_id) AS x, agc.operation
FROM geometry_component agc
JOIN volume av ON av.id = agc.volume_id
JOIN volume_dependency avd ON avd.id = av.contributor_id
JOIN my_rowset_function('2013-02-22') ca ON ca.feature_id = avd.id
WHERE agc.timeslice_id = 12345
ORDER BY agc.sequence
) sub1
)sub2
)sub3
答案 1 :(得分:1)
不幸的是,这是实施的正常怪癖。当LATERAL
查询支持9.3时,可以避免此问题。
目前我还没有发现任何好的解决方法。