我的情况:
我有一些二进制数据,它们被分成了很多部分。特殊表FileParts
包含fileId
、partNo
和data
。
我需要把所有部分一起放到另一张桌子上MyFilesStorage
。
现在我在两种实现之间进行选择:
DO $CODE$
declare
r record;
begin
UPDATE public.MyFilesStorage SET mainFileData = E''::bytea WHERE id = 'e14a26c0-db4b-47e1-8b66-e091fb3ba199'::uuid;
for r in ( select data
from public.FileParts
where fileId = '89cb8598-436b-49b3-bb1c-34534c6d068e'::uuid
order by partNo ) loop
UPDATE public.MyFilesStorage SET mainFileData = mainFileData || r.data WHERE id = 'e14a26c0-db4b-47e1-8b66-e091fb3ba199'::uuid;
end loop;
end;
$CODE$
我将数据设置为空,然后逐个读取部分并将每个部分附加到主表中。
另一种变体:
DO $CODE$
declare
r record;
p_result bytea;
begin
p_result = E''::bytea;
for r in ( select data
from public.FileParts
where fileId = '89cb8598-436b-49b3-bb1c-34534c6d068e'::uuid
order by partNo ) loop
p_result = p_result || r.data;
end loop;
UPDATE public.MyFilesStorage SET mainFileData = p_result WHERE id = 'e14a26c0-db4b-47e1-8b66-e091fb3ba199'::uuid;
end;
$CODE$
在这里我使用临时变量。第二个更快,但我不知道会占用更多内存吗?首先我需要内存来将所有文件加载到 RAM,那么首先呢?postgre 会在此处加载所有内容:mainFileData = mainFileData || r.data
?
也许还有另一种方法可以做到这一点,因为这两种变体都非常慢?在 oracle 中,我DBMS_LOB.APPEND
用于此操作。