PostgreSQLの質問です。


プログラムを1回起動させると複数のテーブルにINSERTが70回ほど走ります。日に最低でも50回ほどの起動が予想されるため、1日に3500回以上のINSERTが走ることになります。
 ※これ以外にもいくつかの処理が並行して走って
  いますが、ここではこの条件でのみお考えいた
  だければOKです。


少しでもDBへの負荷を軽減、スピードアップするために何らかの処置を取ろうと思いますが、何か効果的な方法があれば教えてください。


以下は案・条件・疑問です。
・プログラムからSQLを発行するより、
 psql経由の方が軽い??(未確認)
・極力bindを使用する。
・DBとの永続接続
・ほぼリアルタイムで反映する必要があるため
 cron+バッチは今回検討しない。

回答の条件
  • 1人3回まで
  • 登録:2006/08/07 11:01:40
  • 終了:2006/08/14 11:05:03

回答(5件)

id:keisen No.1

keisen回答回数33ベストアンサー獲得回数02006/08/07 11:10:52

ポイント20pt

正確に測定したわけではないので経験則になってしまいますが、

ご質問の環境ですと、PLSQLを使うのが最も妥当だと思います。

id:katsube

コマンドラインツールのpsqlではなく、言語のPL/pgSQLを使用した方が良いということですよね。

なるほど。わたしも計測したことないのですが、何からの言語(C,Perl,PHPなど)から問い合わせを行うより、PL/pgSQLの方が軽いor速いということでしょうか?

2006/08/07 11:17:03
id:keisen No.2

keisen回答回数33ベストアンサー獲得回数02006/08/07 11:26:50

ポイント20pt

> わたしも計測したことないのですが、

> 何からの言語(C,Perl,PHPなど)から問い合わせを行うより、

> PL/pgSQLの方が軽いor速いということでしょうか?

だと思います。

複数回のINSERTを実行するのであれば、

どのような言語を使っても外部から複数問い合わせすることに変わりは無いと思います。

それよりも、PL/SQLで一気に処理してしまった方が早いように思います。

実績値が無いので空想の域をでませんが(^^;

id:katsube

なるほど、なるほど。

keisenさんのお話をお伺いすると、確かにDB内部に用意された機構をダイレクトに使用した方が速そうな印象ありますね(^^;



私も調べてみますが、もしどなたかが実験されているページなどあれば教えてくださいませ>皆様


また他のアプローチ方法なども募集しています。

2006/08/07 11:31:14
id:tombe No.3

tombe回答回数38ベストアンサー獲得回数72006/08/07 11:58:27

ポイント20pt

1回あたり70回のINSERTということでしたら、INSERTの代わりにCOPYコマンドを使うと多少速いかもしれません。

http://www.postgresql.jp/document/pg721doc/reference/sql-cop...

上記URLの概略では「ファイルとテーブルの間でデータをコピーします。」とありますが、stdinへのパイプが使えますのでアプリから動的データを流し込めばOKです。

「1日に3500回以上」というのは、それほど高い負荷では無いような気もしますが参考までに。

id:katsube

>stdinへのパイプが使えますので

なるほど!

COPYコマンドは盲点でした。標準入力が受け取れるならメモリ上で完結しそうですね。これも実験してみたいと思います。


> 「1日に3500回以上」というのは、

> それほど高い負荷では無いような気も

> しますが参考までに。

ここ三~六ヶ月程度でこの10倍以上になるんじゃないかという予測が立っているので、打てる手は今のうちに打っておこうという意図で質問してみました。

2006/08/07 12:29:52
id:mass3 No.4

mass3回答回数118ベストアンサー獲得回数152006/08/07 15:53:09

ポイント20pt

・サーバコンピュータのメモリの大きさやディスク性能によって、

COMMITのタイミングで性能が変わります。

以下のように変えて性能測定をしてみてはいかがでしょうか?

  • 1回のINSERT毎に70回
  • N回のINSERTにつき1回
  • 70回INSERTの後に1回だけ

・INSERT時にはインデックスが多いと負荷になります。

SELECT文を洗い出して、EXPLAINで実行計画を見て、

有効に使われないインデックスはドロップしましょう。

・「極力bindを使用する」は正しい対処です。

プリペアされたSQLを使用することで、

PostgreSQL内部での構文解析が1回ですみます。

id:b-wind No.5

b-wind回答回数3344ベストアンサー獲得回数4402006/08/08 04:01:45

ポイント20pt

INSERT が多いということですと、COPY または psql コマンドの \copy を使うのが常套手段ですが、PostgreSQL 本体のチューニングも視野に入れてはいかがでしょうか?

このばあいトランザクションログバッファやライタープロセスのチューニングが有効に思えます。

https://www.stackasterisk.jp/tech/dataBase/postgresTuning01_...

http://www.thinkit.co.jp/free/tech/10/1/1.html

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません