我有一个表(10k 行),用于存储大值text
柱子。当前最大的未压缩大小为 417 MB(烘烤后为 85 MB)。此设计的缺陷是无法传输这些值(例如通过 JDBC)——使用此列的任何内容都必须将整个内容读入内存。
是否有任何工具或快捷方式可用于将此列迁移到大型对象?最大限度地减少所需的工作磁盘和内存。
我将使用lo_compat_privileges
如果这有什么区别的话。
为什么不直接使用lo_from_bytea https://www.postgresql.org/docs/current/lo-funcs.html?
Example:
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 https://www.postgresql.org/docs/current/sql-vacuum.html or a CLUSTER https://www.postgresql.org/docs/current/sql-cluster.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)