[pgsql-jp: 28374] Re: PostgreSQLのパフォーマンス

Iwao Watanabe iwao3 @ DSL.gr.jp
2002年 12月 19日 (木) 11:44:12 JST


こんにちは

私は 今のところ PostgreSQL 7.1.x までしか利用していないので
下記内容はその範囲の知識で書いています。
間違っているなら どなたか指摘してください。

----- Original Message ----- 
From: "Tamotsu Ebina" <ebina @ pluto.dti.ne.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Wednesday, December 18, 2002 5:51 PM
Subject: [pgsql-jp: 28367] PostgreSQLのパフォーマンス


> 
> テストプログラムは、すべてPreparedStatemenを使用しています。
> 1)主となるテーブルを全件検索する。読むテーブルは各スレッドとも
>  同一テーブルですがスレッド毎に対象となる行のキーが異なります。
> 2)上記で読んだ行のキーで別テーブルを読む。
> 3)該当する行が2)で見つからなければ1)の内容を別テーブルにinsertする。
> 4)全件処理した段階でcommitを出す。
> と言った処理です。
> 
> スレッド間では処理するキーの重複は無いのでinsertするテーブルには
> LOCKはかけていません。
> INDEXはそれぞれのテーブルにPrimaryKeyが作成されています。

実験されている内容は、登録されているデータの件数にもよりますが,
上記を1トランザクションで処理されているとすれば、それなりに重い内容ですね。
要件的に許されるなら1)のあとですぐにcommit したいところです。

あるいは,exists を使って 1)テーブルのうち、2)に含まれないものをSELECTで抽出して
即 3)の別テーブルに INSERTする一発のSQLでいけそうな気もします。

例:
insert into foo3 ( aa,bb,cc) 
select aa,bb,cc from foo1 
where not exists (select * from bar2 where bar2.aa = foo1.aa)

要件によっては
select count(*) from foo1 
where not exists (select * from bar2 where bar2.aa = foo1.aa)
として まず件数を確認してから、処理を振り分けるくらい してもよいでしょう。

上記の処理内容は,トランザクション遮断レベルがどれに調整されているかで
DBMSの処理内容は思いっきり変わります。
(もしかしたら 商用DBとPGでは 異なる遮断レベルで動作しているかもしれません。)
個別のトランザクションが同一のテーブルに走査と挿入を繰り返すなら
DBMSはかなり大変な処理をしていることになります。
誰(それぞれのコネクションを担当するPostgresのプロセス)が
何時まで何を覚えておかないといけないか想像つきますか?

それから PostgreSQL の PreparedStatemen は Statement と 速度的に ちっとも変わりません。
毎回サーバーには展開されたSQLテキストが送られて、SQLの構文解析しているのです。

処理件数が多くて 速度が本当に要求されるのなら、
全部の処理をJDBCで行わないで
積極的にサーバーサイド言語を使うべきだと思います。
クエリやデータをソケット経由でやり取りしないほうが 速いに決まっています。
上記の処理なら、1〜3 でそれが可能ですね。

これ以上は、データの性質と、実テーブルの定義と、
発行するつもりのSQLと  JAVAコードをみないと 
パフォーマンス チューニングの詳しい判断は難しいような気もします。





pgsql-jp メーリングリストの案内