Hatena::Grouppostgresql

PostgreSQL 雑記 このページをアンテナに追加 RSSフィード

2011-02-21SQL/MED & file_fdw in PG9.1 このエントリーを含むブックマーク このエントリーのブックマークコメント

9.1 の目玉機能の1つ、SQL/MED 外部テーブル機能が採用されました。DB外部のデータを、テーブルの形で参照するための拡張です。サポートしているのは外部データの読み取りのみです。更新はできないため、PostgreSQLにもストレージ・エンジンが?というと流石に言いすぎですが、いろいろと面白いことはできそうです。リモートサーバのDB (PGでもそれ以外でも) との連携、CSVやオフィスファイルの読み取り、ウェブAPIへの直接接続など、ありとあらゆるデータをSQLという柔軟な言語で検索、整形できる魅力があります。

FOREIGN DATA WRAPPER

CREATE FOREIGN DATA WRAPPER コマンドに、HANDLER オプションが追加されました。ハンドラ関数は、以下のコールバックを実装した FdwRoutine オブジェクトを返却します。9.1の時点では、テーブル1つを参照する非常に素直なAPIです。

  • PlanForeignScan() : コスト等の実行計画情報の返却
  • ExplainForeignScan() : EXPLAIN 用の情報表示
  • BeginForeignScan() : スキャンの開始
  • IterateForeignScan() : 次のスキャン結果行の返却
  • ReScanForeignScan() : スキャンを最初からもう一度
  • EndForeignScan() : スキャンの終了

ところで、PostgreSQL には以前からテーブル関数 (SRF: SETOF Record Function) がありました。機能上は SRF + VIEW でも似たようなことはできますが、外部テーブルには以下の利点があります。

  • WHERE句に指定された条件を引き継げる (condition pushdown) ため、外部DBが絞込機能を持っている場合には全データを取得せずに済む。
  • 大量データをストリーム的に処理でき、省メモリ。SRFは結果行をすべていったんキャッシュしてしまう。
  • EXPLAIN に対応している。

file_fdw

contrib/file_fdw は、外部データラッパの実用例で、外部のタブまたはカンマ区切りのファイルを読み込めます。COPY FROM コマンドの読み込み部分だけを抜き出したものですが、インポートした後すぐに加工して他のテーブルに移し替えるような必要がある場合には、作業用のテーブルが不要になるため効率的です。

CSVファイルを読み込むコマンド例は以下になります。ユーザマッピング (CREATE USER MAPPING) も必須ではなくなったので、かなり手軽になりました。

-- 最初に1回だけ
CREATE EXTENSION file_fdw;
CREATE SERVER localfs FOREIGN DATA WRAPPER file_fdw;
-- ファイルごと
CREATE FOREIGN TABLE external_csv (id char(3), name text, ...)
  SERVER localfs
  OPTIONS (filename '/path/to/file.csv', format 'csv', encoding 'sjis');
SELECT * FROM external_csv;


file_fdw 以外にも、dblink の代替となる postgresql_fdw が計画されています。WHERE句の引き継ぎが有効に使える (外部DBのインデックスが使える) 好例ですね。コア以外でも twitter_fdw が作られていますし、個人的には groonga_fdw (proonga の名前は早い者勝ち?) も作ってみたいところ。「象の群れ構想」も現実味が出てきました。