将PostgreSQL text / bytea列迁移到大对象?

问题描述 投票:0回答:1

我有一个表(10k行),在text列中存储大值。当前最大的是417 MB未压缩(85 MB烘烤)。这种设计的缺陷是不可能传输这些值(例如通过JDBC) - 使用此列的任何内容都必须将整个内容读入内存。

是否有可用于将此列迁移到大型对象的工具或快捷方式?最小化所需的工作磁盘和内存。

我将使用lo_compat_privileges,如果这有任何区别。

postgresql blob psql jdbc-postgres
1个回答
4
投票

为什么不使用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 FULLCLUSTER进行清理。

© www.soinside.com 2019 - 2024. All rights reserved.