[pgsql-jp: 25694] Re: ラージオブジェクトの削除後の領域開放

kumiko naito naito @ mdsnet.co.jp
2002年 4月 24日 (水) 13:26:10 JST


お世話になっております。内藤です。

丁寧に教えていただき、有難うございました。
lo_unlinkで実際のオブジェクトが削除されるという
ことですね。psqlから検証して、vacuum後、領域が
開放されることが確認されました。
後はdeleteとupdate用にトリガーを作れば良い訳ですね。

トリガー使用だとレスポンスの心配が少しだけあったのですが
時間がかかるのはvacuumの時だけの様なので、この方向で
進めたいと思います。

お忙しい中、どうも有難うございました。

>
>   杉田です。
>
> From: "kumiko naito" <naito @ mdsnet.co.jp>
> Subject: [pgsql-jp: 25684] Re: ラージオブジェクトの削除後の領域開放
> Date: Wed, 24 Apr 2002 11:20:32 +0900
>
> ;;; create table image (name text,raster oid) の場合、このテーブルに格納さ
> れてい
> ;;; るのは
> ;;; oidだけで、実際のラージオブジェクトは別の場所にあるわけですよね。
> ;;; この実際のオブジェクトを何らかの方法で削除しなければならないという事で
> しょう
> ;;; か?
>
>   はい。
>
> ;;; イメージ的にはOracleの BLOB型(DB内でラージオブジェクトを保持・管理
す
> る)
> ;;; では無く、
> ;;; BFILE型(管理情報のみをDBに格納し、実際のデータは外部に持つ)に近い
と
> ;;; 考えたほうが良いのでしょうか?
>
>   データはデータベース内にあります。
>
> ;;; 現在は検証のため、ローカルDBにpsqlでアクセスしていますが、実際のシス
> テムで
> ;;; は
> ;;; JDBC経由になります。(本番サーバはSolarisになると思います。)
> ;;;
> ;;; すみませんが、明示的な開放のしかたを、もう一度、ご教授いただけますでし
> ょうか
> ;;; ?
>
>   JDBC による直接の例は、他の方にお願いします。
>
>   JDBC に関わらず、次のようにして、カタログ化されたレコードを削除したとき
に
>> BLOB を自動的に削除することもできます。
>
>     -- テーブル定義
>     DELETE FROM icon_catalog;
>     DROP TABLE icon_catalog;
>     DROP SEQUENCE icon_catalog_id_seq;
>     CREATE TABLE icon_catalog
>     (
> 	id       SERIAL,
> 	name     TEXT    NOT NULL,
> 	width    INTEGER NOT NULL,
> 	height   INTEGER NOT NULL,
> 	data_oid OID     NOT NULL,
>
> 	CONSTRAINT check_name     CHECK(length(name) > 0),
> 	CONSTRAINT check_width    CHECK(width > 0),
> 	CONSTRAINT check_height   CHECK(height > 0),
> 	CONSTRAINT check_data_oid CHECK(data_oid > 0)
>     );
>
>     COMMENT ON TABLE icon_catalog IS 'アイコンカタログ';
>     COMMENT ON COLUMN icon_catalog.name IS 'アイコンのベースファイル名';
>     COMMENT ON COLUMN icon_catalog.width IS 'アイコンのピクセル幅';
>     COMMENT ON COLUMN icon_catalog.height IS 'アイコンのピクセル高';
>     COMMENT ON COLUMN icon_catalog.data_oid IS 'アイコンデータのラージオブ
> ジェクトID';
>
>     -- icon_catalog のインデックス定義
>     CREATE INDEX icon_catalog_name_idx ON icon_catalog(name);
>
> =>  -- icon_catalog のレコード削除時に、アイコンデータを BLOB から削除する
> トリガーの定義
> =>  DROP FUNCTION icon_catalog_after_delete();
> =>  CREATE FUNCTION icon_catalog_after_delete() RETURNS OPAQUE AS '
> =>  DECLARE
> =>	sql TEXT;
> =>  BEGIN
> =>	sql := ''SELECT lo_unlink('' || OLD.data_oid || '')'';
> =>	EXECUTE sql;
> =>	RETURN NULL;
> =>  END;
> =>  ' LANGUAGE 'plpgsql';
>
>     COMMENT ON FUNCTION icon_catalog_after_delete()
> 	IS 'icon_catalogレコードの削除時に対応するBLOBを削除';
>
> =>  CREATE TRIGGER icon_catalog_after_delete_hook AFTER DELETE
> =>	ON icon_catalog FOR EACH ROW
> =>	EXECUTE PROCEDURE icon_catalog_after_delete();
>
>     COMMENT ON TRIGGER icon_catalog_after_delete_hook ON icon_catalog
> 	IS 'icon_catalogレコードの削除時に対応するBLOBを削除';
>
>
> Kenji Sugita
> sugita @ sra.co.jp
>




pgsql-jp メーリングリストの案内