Переносить текстовый / байтовый столбец PostgreSQL в большой объект? - PullRequest
1 голос
/ 05 марта 2019

У меня есть таблица (10 тыс. Строк), в которой хранятся большие значения в столбце text.На данный момент самое большое - 417 МБ несжатого (85 МБ тостов).Недостаток этого проекта в том, что невозможно передавать эти значения (например, через JDBC) - все, что использует этот столбец, должно считывать все это в памяти.

Есть ли какие-либо инструменты или ярлыки, доступные для переноса этого столбца вбольшие объекты?Минимизация рабочего диска и требуемой памяти.

Я буду использовать lo_compat_privileges, если это что-то изменит.

1 Ответ

4 голосов
/ 05 марта 2019

Почему бы просто не использовать 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 или CLUSTER.

...