postgresql - 在 pl/SQL 循环中创建数百万个表时如何防止“内存不足”异常?
问题描述
我有一个相当复杂的任务要在 PostgreSQL 中解决。本质是我需要在 10 个数组上执行 pl/pgsql 循环,并在约 100 万个数组上执行嵌套循环。根据每个数据条目的条件,我必须创建大约 5-8 个表。然后,这导致一个事务中的表总数约为 50-80 百万个表。我需要创建表以对其进行索引以进行其他SELECT
计算,如果没有它,这些计算将无法执行。然而,所有这一切的结果实际上是只有一个 id 表,这就是为什么我CREATE
在循环中的所有表也在DROP
每次迭代结束时被 ped。
问题是我得到一个out of memory
错误。我不知道如何重写我的代码以将其拆分为单独的事务或类似的东西。我有 Postgres 10.14 版,目前无法升级。
有人知道如何解决这个问题吗?
解决方案
我不知道如何重写我的代码以将其拆分为单独的事务
您可以使用存储过程而不是函数。程序可以使用事务,只需在代码中使用 begin 和 commit。因此,在您的循环中,您可以执行以下操作:
BEGIN
CREATE TEMPORARY TABLE (...) ON COMMIT DROP
...do your thing with the temp table...
INSERT the result into a more permanent table
COMMIT
确保使用临时表,这样会更快。
但是,如果您想在临时表上使用索引,那么您可能还想事先分析它们,在这种情况下,您可以使用 ANALYZE 但不能使用 VACUUM ANALYZE,因为这将提交您的事务,并且如果表是使用 ON COMMIT DROP 创建的然后在分析之前将其丢弃...
现在,老实说,创建数百万个表是非常可疑的,所以如果你问一个问题来解释你正在尝试做什么,也许会有一个更简单的解决方案。
推荐阅读
- javascript - 对 websocket 子组件性能做出反应
- python - 如何根据 Pandas 中同一列上的相邻值更改值
- android - 更改表并添加列,但检查该列是否已存在于 android studio
- amazon-web-services - Aws - 用户是否为返回 Not Found 状态代码的请求付费?
- javafx - 如何在 Javafx 中进行动态布局?
- c++ - 如何修复 lib libstdc++ 的 `std::variant`(来自 GCC 9.1)不适用于 Clang 8?
- javascript - ArcGIS JS-API,将 InfoTemplate 添加到现有图形
- algorithm - 面试问题 - 哪些数字在间隔列表中出现次数最多
- r - 为什么 R 文档没有指定所需的包?
- typescript - 如何实现具有多个未命名函数成员的接口?