回答

收藏

扩展复合结果时,避免在同一函数上多次调用

技术问答 技术问答 259 人阅读 | 0 人回复 | 2023-09-12

我有一个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    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则