将PostgreSQL文本/字节列迁移到大对象?

时间:2019-03-05 15:56:49

标签: postgresql blob psql jdbc-postgres

我有一个表(1万行),该表在text列中存储较大的值。当前最大文件大小为417 MB未压缩(已烤制85 MB)。这种设计的缺点是无法流传输这些值(例如,通过JDBC)-使用此列的任何内容都必须将整个内容读入内存。

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

如果有任何不同,我将使用lo_compat_privileges

1 个答案:

答案 0 :(得分:2)

为什么不只使用the release notes

示例:

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数据库,并且不会立即删除所有数据,因此您应该使用lo_from_byteaVACUUM FULL清理所有内容。