我们有一个 postgres 进程,其工作方式如下:-
1) CSV 文件拆分成一个表,每条记录一行
2) pagent 运行一个 postgres 函数,该函数读取每条记录并将其作为新记录或更新写入新表
3)触发器在新表上运行,并根据记录值运行 plv8 函数来更新其数据(涉及相当多的 json 处理,plv8 是最简单的编码方法)。第二次更新来自 plv8,我们使用了以下模式:-
query = plv8.prepare('...');
query.execute(<params>);
query.free();
当我们监控这一点时,我们看到处理 5000 条记录使用 14Gb 的虚拟内存。所以有些事情是错误的,因为 CSV 记录的大小小于 1k。在我们向表中添加新索引后,这种情况变得很严重。
我们应该在哪里寻找解决方案?它是否正常,是否与事务中正在更新的索引或其他因素相关联。