【发布时间】:2019-03-10 23:25:14
【问题描述】:
我正在运行一个 Python 脚本,它处理多个不同指标的时间序列数据,然后将结果写入 Postgres 数据库。
时间序列假设 40 个 epoch,在数据库中存储为 real[40] 数组列。
当一次性将所有 40 个 epoch 的输出写入表时(所有行的批量更新),一切似乎都运行良好。即
UPDATE my_table SET
arr_col_1 = {1, 2, 3, ... 40},
arr_col_2 = {1, 2, 3, ...40},
...
arr_col_90 = {1, 2, 3, ...40};
但是,将各个时期的结果迭代地写入数组中的每个位置似乎会占用硬盘驱动器上的所有可用空间,例如
UPDATE my_table SET
arr_col_1[1] = 1,
arr_col_2[1] = 1,
...
arr_col_90[1] = 1;
UPDATE my_table SET
arr_col_1[2] = 2,
arr_col_2[2] = 2,
...
arr_col_90[2] = 2;
-- repeat x 38 more times
迭代策略的原因是为了容纳更多的行,40个epoch的结果不能同时放入内存。
据我所知,UPDATE 查询在某些情况下会删除和重写行数据,但我不清楚何时会发生这种情况以及这可能与数组有什么关系。有没有办法在不导致数据库膨胀的情况下迭代地更新大量行的数组?
【问题讨论】:
-
您的数据库设计对我来说似乎是错误的。您能否共享完整的表架构以及此表与其他表之间存在哪些关系。粗略地说,您应该将数据库模式降低到 3NF 以进行高效编写。
-
Postgres 支持数组,是的。但是,我们不必(ab)使用来存储这样的数据,忽略更合适的关系数据库规则,这些规则是任何传统模式/表结构设计的基础。
-
我不需要单独查询时期,所以跨列分散时期真的更好吗?还是我应该改用 JSONB?
标签: postgresql sql-update mvcc