私の場合:PostgreSQLデータベースのバイナリコンテンツをバイト列に追加します。
私はいくつかのバイナリデータを持っています。特別表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$
私は空のように、データを設定し、その後、部品を一つずつ読み、メインテーブルに各パーツを追加します。
他の変形例:ここでは
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
?
おそらく、これを行う別の方法があります。両方のバリエーションがあるためveeeeery slow? oracleでは、この操作にはDBMS_LOB.APPEND
を使用します。
PostgreSQLラージオブジェクト機能を使用することができます。この場合、最後に検索して書き込みを行うことで高速追加を行うことができます。 http://www.postgresql.org/docs/9.1/interactive/lo-interfaces.html#LO-SEEKバイトアに比べていくつかの制限がありますので、注意深く見てください。一方、ファイルパーツを使って何をしているのかは、PostgreSQLがTOASTシステムを介して内部的に行っていることと非常に似ていますが、デフォルトで圧縮を試みる点が異なります。 http://www.postgresql.org/docs/9.1/interactive/storage-toast.htmlこれは完全に自動で透過的です。 – kgrittn
ありがとう。それは非常に有用なアドバイスです!私はLOインターフェイスを試してみます。 – Yavanosta