将 PostgreSQL text/bytea 列迁移到大对象?
Migrate PostgreSQL text/bytea column to large object?
我有一个 table(10k 行),它在 text
列中存储大值。当前最大的是 417 MB 未压缩(85 MB toasted)。此设计的缺陷是无法流式传输这些值(例如,超过 JDBC)- 使用此列的任何内容都必须将整个内容读入内存。
是否有任何工具或快捷方式可用于将此列迁移到大型对象?最小化所需的工作磁盘和内存。
如果有任何不同,我将使用 lo_compat_privileges
。
为什么不直接使用 lo_from_bytea
?
示例:
SELECT 'test'::text::bytea;
bytea
------------
\x74657374
(1 row)
SELECT lo_from_bytea(0, 'test'::text::bytea);
lo_from_bytea
---------------
274052
(1 row)
SELECT lo_get(274052);
lo_get
------------
\x74657374
(1 row)
因此,要真正将数据从文本移动(最好有一个备份)到 OID,您可以执行以下操作:
ALTER TABLE mytable ADD COLUMN value_lo OID;
UPDATE mytable SET value_lo = lo_from_bytea(0, value::bytea), value = NULL;
ALTER TABLE mytable DROP COLUMN value;
ALTER TABLE mytable RENAME COLUMN value_lo TO value;
...最后,由于 PostgreSQL 是一个 MVCC 数据库并且不会立即删除所有数据,因此您应该使用 VACUUM FULL
or a CLUSTER
.
进行清理
我有一个 table(10k 行),它在 text
列中存储大值。当前最大的是 417 MB 未压缩(85 MB toasted)。此设计的缺陷是无法流式传输这些值(例如,超过 JDBC)- 使用此列的任何内容都必须将整个内容读入内存。
是否有任何工具或快捷方式可用于将此列迁移到大型对象?最小化所需的工作磁盘和内存。
如果有任何不同,我将使用 lo_compat_privileges
。
为什么不直接使用 lo_from_bytea
?
示例:
SELECT 'test'::text::bytea;
bytea
------------
\x74657374
(1 row)
SELECT lo_from_bytea(0, 'test'::text::bytea);
lo_from_bytea
---------------
274052
(1 row)
SELECT lo_get(274052);
lo_get
------------
\x74657374
(1 row)
因此,要真正将数据从文本移动(最好有一个备份)到 OID,您可以执行以下操作:
ALTER TABLE mytable ADD COLUMN value_lo OID;
UPDATE mytable SET value_lo = lo_from_bytea(0, value::bytea), value = NULL;
ALTER TABLE mytable DROP COLUMN value;
ALTER TABLE mytable RENAME COLUMN value_lo TO value;
...最后,由于 PostgreSQL 是一个 MVCC 数据库并且不会立即删除所有数据,因此您应该使用 VACUUM FULL
or a CLUSTER
.