我有一个SQL复合结果的函数重新调整。 ) T, |2 k* P; `6 ICREATE TYPE result_t AS (a int,b int,c int,d numeric);CREATE OR REPLACE FUNCTION slow_function(int)RETURNS result_tAS $$ -- just some placeholder code to make it slow SELECT 0,0,0,( SELECT sum(ln(i::numeric)) FROM generate_series(1,$1) i )$$ LANGUAGE sql IMMUTABLE;在调用函数时,我希望将复合类型的各个部分扩展到几列。当我打电话时,它很容易使用: ! i1 F5 w. t# ]$ u+ ESELECT (slow_function(i)).*FROM generate_series(0,200) ia b c d ---- ---- ---- -------------------- (null) 0 0.6931471805599453 1.791759469228055...Total runtime: 6196.754 ms不幸的是,这将导致 每个结果列 仅调用 一次! }& g) V& @! m2 W* P
这个函数,这将不必要地降低速度。通过比较运行时间和查询,可以直接返回复合结果并以四倍的速度运行:6 w+ E6 {2 O" j/ A+ `, y- L
SELECT slow_function(i)FROM generate_series(0,200) i...Total runtime: 1561.476 ms示例代码也位于http://sqlfiddle.com/#!15/703ba/75 F4 _. p! S F$ Q) }' M
如何不浪费?CPU获得多列结果的能力? : A) ^! ]; l/ c I" Q! A' k# q* V6 Y: q解决方案: