2

N台のマシンがそれぞれ1つのpostgresデータベースを持ち、同じスキーマと意味のテーブルAを持つ状況を考えてみましょう。パフォーマンス上の理由からこのアーキテクチャーに固執する必要がありますが、すべての集約データを結合して各データベースをリフレッシュするのは苦労します。All-To-All Union of Postgresデータベーステーブルを作成する最も簡単な方法は?

私はこれを自動化することができましたエクステントがやってシェルスクリプトです:

mycopy=tableA_`hostname`.pg 
pg_dump -t tableA -d $database | sed "s/tableA/$mycopy" > $mycopy 
for host in host_x host_y host_z; do 
    scp $mycopy host:~/ 
done 

し、SQLスクリプト:

BEGIN; 
\i tableA_hostx.pg 
\i tableA_hosty.pg 
\i tableA_hostz.pg 
CREATE TABLE new_tableA AS 
       (select * from tableA) 
UNION DISTINCT (select * from tableA_hostx) 
UNION DISTINCT (select * from tableA_hosty) 
UNION DISTINCT (select * from tableA_hostz); 
DROP TABLE tableA; 
DROP TABLE table_hostx; 
DROP TABLE table_hosty; 
DROP TABLE table_hostz; 
ALTER TABLE new_tableA rename to tableA; 
COMMIT; 

をしかし、これは非常に明確に定義された普通です私がやっていると感じている事柄なので、このようなオール・トゥオール・コミュニケーションのための高度な高レベル・インターフェースがあるのだろうかと思います。 the postgres wikiに記載されているいくつかの分散データベースのアプローチがありますが、いずれも正確にこれを行うことができますし、そうでなければ私のデータベースについて多くのことを再考したり、

+0

on-an-ubuntu-12-04-vps)? –

+0

ええと、N個のホストのそれぞれでpg_basebackup(N-1)回実行する必要があるようですね。私は、pg_dump + scpアプローチに比べてどんな利点があるのか​​よくわかりません。私はSQLスクリプトでやっているように、自動的に各テーブルをUNION DISTINCTにマージしますか?また、私は他のテーブル(テーブルA)をマージしたくありません。 – seewalker

+0

あなたはどのpostgresqlバージョンを使用していますか? – harmic

答えて

3

私はそのために外部テーブルを使用します。

リモートホストごとに1つの外部テーブルを作成します。次に、union問合せを含むマテリアライズド・ビューを作成します。

すべてを更新する場合は、実行する必要があるのはrefresh materialized view tablea_combinedです。ダンピングや復旧は必要ありません。

もちろん、他のすべてのサーバーに接続できるすべてのサーバーを組み合わせたサーバーを想定しています。

これらのテーブルをすべて簡単に選択したい場合は、単純なビューで十分です。パフォーマンスが十分であれば、それを使って何をするかによって異なります。

9.5以降を使用する場合は、uses inheritanceという外部テーブルを「マスター」サーバー上の1つのテーブルに結合するパーティションテーブルを作成できます。これを効率的に行うには、「ソース」サーバーを識別する列があり、パーティション化キーとして使用できる必要があります。

関連する問題