Hatena::Grouppostgresql

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

2013-09-14postgres_fdw このエントリーを含むブックマーク このエントリーのブックマークコメント

PostgreSQL 9.3 にて postgres_fdw が追加されました。外部の PostgreSQL サーバの表を読み書きするための仕組みです。これまでもリモートDBにアクセスする方法には dblink や PL/Proxy がありましたが、FDW: Foreign Data Wrapper を基礎とするため、SQL として自然な構文を使えることが利点です。

機能についての詳しい説明は第26回 しくみ+アプリケーション勉強会 のスライドにありましたが、できることを簡単な表にもまとめてみます:

操作可否補記
参照 (SELECT)インデックスも使われる
追加 (INSERT) 
更新 (UPDATE)SELECT FOR UPDATE + ctid scan
削除 (DELETE)同上
絞込: 組み込みの関数/演算子initdb中に登録されるもの (OID<10000で判定)
絞込: ユーザ定義の関数/演算子×インライン展開されたSQL関数は、組み込み扱いになることも
結合 (JOIN)×リモートから取得後、ローカルで処理される
ソート (ORDER BY, LIMIT)×同上
集約 (GROUP BY)×同上
統計情報 (ANALYZE)リモート or ローカルどちらでも保持できる
トランザクション 

なお、可否=×は「リモートで実行できないため効率が悪い」の意味であり、処理はローカルで行われるので結果自体に間違いはありません。これらの機能を踏まえると、9.3時点での postgres_fdw を使う際に、性能面で気をつけるのは、以下の点でしょうか:

  • 外部表を参照する場合、その外部表単体で完結するような絞り込みを行う。同じリモートサーバ内の表との結合でも効率は悪い。
  • リモート表の大量の更新や削除は避ける。合致する行を1行ごとに ctid を指定して UPDATE/DELETE を繰り返すため。SELECT FOR UPDATE する関係で、候補行の大量取得さえもマズい。
  • ローカル/リモート間および複数のリモート間で処理がパラレルに行われることは期待できないlibpq の同期APIを使っているようなので、処理は併走しない。

シンプルな WHERE 句であれば絞込みもリモートで行われるのは素晴らしいですね。 ただ、小さなマスタ表と結合するだけでも最適化が阻害されるため、本来パラレル化の需要が高いであろうデータウェアハウス用途には、まだ荷が重いと思われます。一方、向いているのは、バッチ処理の分散化といった、生データや集計結果だけをやり取りすればよいケースでしょうか。監査目的に、write-once な外部DBにログを INSERT していくような使い方も考えられます。なんにせよ、postgres_fdw は、複数DB連携に向けてのマイルストーンですね。