第 28章ラージオブジェクト

目次
28.1. 歴史
28.2. 実装機能
28.3. クライアントインタフェース
28.3.1. ラージオブジェクトの作成
28.3.2. ラージオブジェクトのインポート
28.3.3. ラージオブジェクトのエクスポート
28.3.4. 既存のラージオブジェクトのオープン
28.3.5. ラージオブジェクトへのデータの書き込み
28.3.6. ラージオブジェクトからのデータの読み込み
28.3.7. ラージオブジェクトのシーク
28.3.8. ラージオブジェクトのシーク位置の入手
28.3.9. ラージオブジェクト記述子を閉じる
28.3.10. ラージオブジェクトの削除
28.4. サーバ側の関数
28.5. サンプルプログラム

7.1 より前の PostgreSQL リリースでは、データベース内の行のサイズはデータページのサイズを越えることはできませんでした。 データページのサイズは 8192バイト(これがデフォルトです。 32768まで増やすことができます。) ですので、データ値の上限は相対的に見て小さなものでした。 この値よりも大きなデータ格納をサポートするために、PostgreSQL はラージオブジェクトインタフェースを提供しました。 現在も提供しています。 このインタフェースは、特殊なラージオブジェクト構造に格納されたユーザデータに対して、ファイル指向のアクセスを提供します。

本章では、PostgreSQLラージオブジェクトデータに関する、実装、プログラミング、問い合わせ言語インタフェースについて説明します。 libpq C ライブラリを例として本章で使用していますが、ほとんどのPostgreSQL固有のプログラミングインタフェースは同等の機能を持っています。 他のインタフェースでは、巨大な値を汎用的にサポートできるように、ラージオブジェクトインタフェースを内部で使用しているかもしれません。 ここでは説明しません。

28.1. 歴史

PostgreSQL の間接的な派生元である POSTGRES 4.2 はラージオブジェクトに関して3つの標準実装、POSTGRES サーバ外部のファイル、POSTGRES サーバで管理される外部ファイル、POSTGRES データベース内に格納されるデータ、をサポートしていました。 これはかなりユーザーの混乱を招きました。 その結果、データベース内に格納されるデータとしてのラージオブジェクトのみをPostgreSQLではサポートしました。 これによってアクセスが少々遅くなりましたが、より厳密に一貫性を持ったデータを提供するようになりました。 歴史的な理由により、この格納の仕組みは転置ラージオブジェクトと呼ばれています。 (この節では、「転置」と「ラージオブジェクト」の両方を使用していますが、どちらも同じ意味です。) PostgreSQL 7.1からは、すべてのラージオブジェクトはpg_largeobjectと呼ばれる、1つのシステムテーブルに格納されます。

PostgreSQL 7.1 では、個々のデータページよりもかなり大きなデータ行を持つことができる("TOAST" というニックネームの)機構を導入しました。 これによりラージオブジェクトインタフェースの一部は旧式のものになりました。 ラージオブジェクトインタフェースに残る利点の1つは、そのサイズが2GBまで可能であるという点です。 TOASTでは1GBまでしか扱えません。