QA@IT

PostgreSQLにてdblinkを使用したクエリーの実行結果を可能な限り早く取得したい

5616 PV

Oracle 10gにてdatabase linkを使用したテーブル同士を結合したSQLがあります。

Select A.KEY_COL
      ,B.COL1
      ,C.COL1
From LOCAL_TABLE A
    ,REMOTE_TABLE1@remote1 B
    ,REMOTE_TABLE2@remote2 C
Where A.KEY_COL = B.KEY_COL
  and A.KEY_COL = C.KEY_COL
  and A.COL2    = 'hoge'
...

DatabaseをPostgreSQLに変更することとなり、下記のようなクエリーを発行したところOracleでは3秒程度で
結果が取得できていたのですが、PostgreSQLでは時間がかかり過ぎてしまい結果を得ることができませんでした。

Create View REMOTE_TABLE1
  Select * From dblink('dbname=remote1 user=postgres',
                       'Select KEY_COL, COL1, COL2 From tbl')
    As t(KEY_COL text, COL1 text, COL2 text);

Create View REMOTE_TABLE2
  Select * From dblink('dbname=remote2 user=postgres',
                       'Select KEY_COL, COL1, COL2 From tbl')
    As t(KEY_COL text, COL1 text, COL2 text);

Select A.KEY_COL
      ,B.COL1
      ,C.COL1
From LOCAL_TABLE A
    ,REMOTE_TABLE1 B
    ,REMOTE_TABLE2 C
Where A.KEY_COL = B.KEY_COL
  and A.KEY_COL = C.KEY_COL
  and A.COL2    = 'hoge'
...

PostgreSQLでdblinkを使用したクエリーの速度を上げる良い方法はありませんでしょうか?

回答

dblinkを上記のように使用すると、常に全件をリモートから取得してしまうので、遅くなりますね。

dblinkの使用が前提であれば、リモートに投げるクエリを毎回生成するなどして転送データ量を減らすのが高速化の第一歩ではないでしょうか。WHERE句に書いた条件をdblinkのクエリで利用するという便利な機能はないので、自作関数などでSQL文字列を組み立てる必要があると思います。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。