我有一个函数接受一个数组作为参数,例如:
CREATE OR REPLACE FUNCTION my_func(some_data custom_datum[]) RETURNS VOID AS $$
BEGIN
create table foo_table as (
select
coalesce(foo_ind, bar_ind, ter_ind) as foobarter,
import_date,
-- do some stuff here
from unnest (some_data) as T
group by grouping sets ((foo_ind, import_date), (bar_ind, import_date), (ter_ind, import_date))
);
END
$$ LANGUAGE plpgsql;
输入数组由另一个函数生成foo
。所以我这样称呼一切:
select my_func(array(select foo()));
功能foo
是:
CREATE OR REPLACE FUNCTION foo() RETURNS SETOF custom_datum
问题是对于大量数据array(select foo())
返回:
错误:数组大小超过允许的最大值 (1073741823)
我要解决的问题是无法传递不同的函数,因为目前,输入数组是由不同的函数生成的:
select my_func(array(select foo()));
select my_func(array(select bar()));
select my_func(array(select ter()));
.... etc
我该如何解决这个问题?
您
my_func
实际上在做的是创建一个MATERIALIZED VIEW
——物化视图是存储为表的结果集的缓存副本。删除函数并使用正常的MATERIALIZED VIEW
.跳过生成数组——浪费时间和空间,甚至可能将结果集序列化到磁盘两次。而且,相反,只需使用这样的东西:
现在你可以通过这样做来“刷新”它
REFRESH foo_view;
您可以限制以下内容的输出
foo()
:或者,最好避免完全使用数组(传递集合,而不是由它构成的数组)。为此,您当然必须重写
my_func()
. 考虑一下,我可以想象这从性能的角度来看也是有益的。