[postgresforest-users 112] Re: パーティション化 (2) で Ludia の pgs2getnhits() を使ういい方法は?

アーカイブの一覧に戻る

Satoshi.Nagatsuma nagat****@nttda*****
2008年 1月 18日 (金) 18:21:43 JST


長妻です。

> ところで、 Ludia には直前の全文検索でのヒット件数を返す pgs2getnhits() という
> 関数が準備されていますが、これを PostgresForest で使おうとすると、
> それぞれの PostgreSQL インスタンスの pgs2getnhits() の結果を返してきます。

Forestのデフォルト動作では、
select now();
select pgs2getnhits();
といったテーブルを特定しないSELECT文を実行する場合、
実行するPostgreSQLインスタンスを順繰りに変更していきます。

ですので、ちょっとトリッキーな書き方になってしまいますが・・・。

for(台数分) {
    rs = stmt.executeQuery("select pgs2getnhits()");
    rs.next();
    count += rs.getInt(1);
}

という感じで全PostgreSQLインスタンスから結果を集約できるはずです。


> 私はパーティション化テーブルで試していますが、
> 多重化テーブルでももしかすると同様の問題があるかもしれません。
> 問題の構造としては、 NOW() などのそれと似ていると思います。

実はレプリケーション(多重化)テーブルの場合、この問題は起きません。
全てのPostgreSQLインスタンスで内容が同じなので、どのインスタンスで
クエリを実行したとしても得られる結果は同じだからです。


> 初期のデータ投入を JDBC 経由で行ったのが少々面倒で時間もかかり、
> もしかしたら PostgresForest 内部で使われているハッシュ関数を利用して
> 初期データをロードするツールを自分で書いた方がいい場面もあるかな、と感じました。

確かにそうですね。
Forestのハッシュ関数は、plJavaから使われることも想定したつくりに
なっていることもあり、結構無駄な内部構造になっている部分もあります。
また、1件1件JAVA上で処理してINSERT文で投入することになりますから、
copy文などでデータを投入するのに比べるとかなり遅くなるのは仕方ないところです。

推奨する使い方ではないですが、最初からどのデータがどのパーティションに
含まれるかわかっていて、なおかつ初期データを投入する状況に限っていえば、
事前に何らかの方法でデータを各パーティションの内容ごとに分割しておき、
psqlで直接各パーティションテーブルに投入するという方法もありますね。
(試してみる or ソースを見てみればわかりますが、
  Forestデフォルトの配置関数は、配置属性のHash値で分割しています)


> フロントエンドの開発は PHP を主に使っていますので、
> PHP/Java Bridge (http://php-java-bridge.sourceforge.net/) を試しています。
> 今のところ、 Tomcat を経由して PHP で無事に PostgresForest を使えています。

PHPとJavaのブリッジの存在は認識していましたが、なかなか手を出せる時間がなく
ずっと放置していました。これは貴重な動作報告ですね!ありがとうございます。


> パーティション化 (2) による分散は、メモリ上の種々のキャッシュの
> 利用効率から見て、大規模な運用にもかなり有望だと思っています。

パーティション化2は柔軟性に富みすぎていて、そのせいで色々と扱いづらい
部分も多々ありますが、それだけに面白い(まだまだ改善のし甲斐がある)
ところです。なんとかもっと使いやすくしていきたいところですね。。。


ASARI Takashi さんは書きました:
> こんばんは。浅利と申します。
> 
> Ludia と PostgresForest のパーティション化 (2) テーブルを使ってみています。
> 規模は数十GB程度で、 8 台に分散させて 8 パーティションを置いています。
> インデックス作成速度も速く、検索スピードも良好で、なかなかよさそうです。
> 
> ところで、 Ludia には直前の全文検索でのヒット件数を返す pgs2getnhits() という
> 関数が準備されていますが、これを PostgresForest で使おうとすると、
> それぞれの PostgreSQL インスタンスの pgs2getnhits() の結果を返してきます。
> 
> 私はパーティション化テーブルで試していますが、
> 多重化テーブルでももしかすると同様の問題があるかもしれません。
> 問題の構造としては、 NOW() などのそれと似ていると思います。
> 
> pgs2getnhits() はとても速いのでできれば使いたいと思っているのですが、
> 何かいい方法はあるでしょうか。
> Parser や ForestStatement あたりの COUNT の扱いを参考に書き換えて
> なんとかなるかとも思ったのですが、ちょっと自分には重いようでした。
> もし、どなたかなにかお知恵がありましたら、お教えいただければ幸いです。
> 
> 
> 以下、その他雑感や現況をチラシの裏的に並べてしまいます。
> 
> 初期のデータ投入を JDBC 経由で行ったのが少々面倒で時間もかかり、
> もしかしたら PostgresForest 内部で使われているハッシュ関数を利用して
> 初期データをロードするツールを自分で書いた方がいい場面もあるかな、と感じました。
> 
> フロントエンドの開発は PHP を主に使っていますので、
> PHP/Java Bridge (http://php-java-bridge.sourceforge.net/) を試しています。
> 今のところ、 Tomcat を経由して PHP で無事に PostgresForest を使えています。
> 
> パーティション化 (2) による分散は、メモリ上の種々のキャッシュの
> 利用効率から見て、大規模な運用にもかなり有望だと思っています。
> これからも PostgresForest を使いたいと思っています。よろしくお願いいたします。
> 




postgresforest-users メーリングリストの案内
アーカイブの一覧に戻る