私の場合:
多くの部分に分割されたバイナリデータがあります。FileParts
、、fileId
およびpartNo
を含む特別なテーブルdata
。
すべてのパーツを別のテーブルにまとめる必要がありますMyFilesStorage
。
今、私は2つの実現から選択しています:
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$
データを空に設定し、パーツを 1 つずつ読み取り、各パーツをメイン テーブルに追加します。
別のバリアント:
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$
ここでは一時変数を使用します。2番目ははるかに高速ですが、どちらがより多くのメモリを必要とするかわかりませんか? 最初にすべてのファイルを RAM にロードするためにメモリが必要ですか? postgre はすべてのコンテンツをここに読み込みます: mainFileData = mainFileData || r.data
?
両方のバリアントが非常に遅いため、これを行う別の方法があるのではないでしょうか? オラクルではDBMS_LOB.APPEND
、この操作に使用します。