データを取得する際に非常に動作が重くなっており、高速化が求められております。
しかし、サーバ、クライアントともにスペックの変更は不可能です。
サーバ側で共用メモリの割当てを増やし、DBに於いてもindexを作成するなどの手を打ったのですが、体感で改善は有りませんでした。
現在の構成で高速化する手段がありましたら教えてください。なおキャッシュサーバ等増設も不可能という前提でお願い致します。
■サーバ
CPU : 3.20DGHz
RAM : 1GB
HDD : 36.3GB*2(RAID1)
OS : Red Hat Enterprise Linux ES release 3
DB : PostgreSQL 7.3.10-RH
■クライアント
CPU : Celeron 2.66GHz
RAM : 1GB
OS : Windows XP Home SP2
チューニングとして他に何を行ったのでしょう?データの件数は?レスポンスはどの位で、クライアントの同時接続台数は?
重いという話しですが、どこで時間を食っているかお調べになりましたか?
私の知っている例だと、サーバからクライアントへの転送時間だと言うことが判って、転送する件数を制限したという例もありますし、回線の種別を変更したといった例もあります。
>重くなっており
の解釈が難しいですね。
1.同時にアクセスするクライアントが増えたからレスポンスが遅いのか。
2.データの量が増えたから遅くなったのか。
3.最初から遅い。
>データを取得する際に
その返りの遅いSELECT文をDBサーバのpsqlで実行しても遅いのか。
>サーバ側で共用メモリの割当てを増やし
クライアントがSELECTを送ったとき、topコマンドでメモリやCPUの使用量を見てみるとどうか。
>DBに於いてもindexを作成するなどの手を打った
EXPLAINとかでINDEXが使用されていることは確認済みであるか。
そもそもデータ数がどれくらいのテーブルにどのようなクエリを発行しているか。
以上のようなところを、まず調べたほうがいいと思います。
参考
PostgreSQLは、
に対応していないようですね。
ストアドプロシージャを検討してみてはいかがでしょうか?
プログラミング:VCL
ストアドプロシージャを実行時に設定するには?
ストアドプロシージャ
残念ながらリンク先のPDFは破損しているようです。検討してみます。
>データの件数は大きなテーブルで
>10~30万件です。
テーブルの件数はそれほど多くないので
利用するデータベースの容量に考慮して
値は設定していますか?
shared_buffers,sort_mem
(Linuxの共有メモリー設定)
以下URLが詳しい
http://www.asahi-net.or.jp/~aa4t-nngk/pgsql5.html
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050402/158372/
http://www.stackasterisk.jp/tech/dataBase/postgresTuning01_04.js...
http://www.postgresql.jp/document/pg734doc/admin/kernel-resource...
http://kantamemo.spaces.live.com/
効果の測定はあくまでPostGreSQL
上で行う。
C++ BuilderはGUIの表示で遅く
なっている可能性もあり。
まずはチューニング。
PostgreSQL�p�t�H�[�}���X�`���[�j���O<��1���F�ݒ���
PostgreSQL:チューニング勘所 - Y-110's Wiki
勘違いしやすいけど、共有バッファは多すぎると逆に遅くなるから。とくに PostgreSQL 7.X 系は。
チューニングはとても難しいから細かい設計とSQLが分からないとアドバイスしにくいかな。
SQL の変更だけでも数倍以上のスループットは出ますよ。
あとは PostgreSQL のバージョンを上げるとか。
7.3→7.4→8.0→8.1 でそれぞれかなり早くなってるから。
なるほど。共有バッファのところは見直してみます。
バージョンを上げることは諸事情によりできないので、SQLを見直してみます。
チューニングに関しては上記に書いてあるだけで、基本的にはvacuumしたあとindex作成してanalyzeしただけです。
データの件数は大きなテーブルで10~30万件です。
一番ネックになっていると思われるテーブルで全件検索を行うと(explain select * from TABLE)コストが8000~9000程となります。
転送時間の計測はどのように行ったのでしょうか?