[pgsql-jp: 29324] Re: パフォーマンス向上策

Daisuke YAMAZAKI dyama @ bres.tsukuba.ac.jp
2003年 3月 9日 (日) 12:39:51 JST


こんにちは、山崎といいます.

さいとうさん(daisaito @ lares.dti.ne.jp) wrote: 

> 齋藤@横浜です。
> 
> 202003/03/09 8:02:38 ごろ
> Shigekazu Aoyagi <aoyagi @ ss.iij4u.or.jp> wrote:さんは以下のように書きました
> > 青柳と申します。
> > 
> > On Sun, 9 Mar 2003 04:23:36 +0900
> > Tsukasa Koizumi <tsukasa @ koiz.com> wrote:
> > 
> > データ量は2倍になりますが、少なくとも検索ごとに2万のテーブルを結合する
> > コストは削減できます。
> > 
> > > ○現行バージョン(2002年2月)
> > > ユーザーが2万を超えた当たりから、動作が著しく遅くなる。
> > > その上、全ユーザの決済履歴を検索、一覧したいとの要望。
> > > 
> > > 高速化に四苦八苦している間に、日々会員数は増え続け、現在に至る(涙)
> > 
> > PostgreSQL のソースを読んでないのであてずっぽですが、PostgreSQL 内部で
> > テーブル自体を探し出すのに時間が掛かっているのではないでしょうか。
> > 
> > PostgreSQL の開発者の気持ちになってみると、普通はせいぜい数十程度の
> > テーブルしかないでしょうから、テーブル名検索にそれほど高度なアルゴリズム
> > は使用しないのではないかと思います。だとしたら、全ユーザの決済履歴どころ
> > かあらゆる処理が遅くなってもおかしくありません。
> 
> PostgreSQL内部では1テーブル1ファイルになっているものと思われます。
> # $PG/data/base/[DB名]/ 以下をのぞいてみただけですので、
> # これを別のところで管理しているとしたら外しています。
> でもって、同じディレクトリの中に数万ものファイルがあると
> 各ファイルにアクセスするのにものすごく時間がかかります。
> たぶん、indexを張るのも無駄だと思います。

これはとても同感です。Postgresは$PGDATA/base/[db名]の
下にテーブルやインデックスファイルをフラットに配置する
ので、テーブルやインデックスなどの探索はそのOSのファイ
ルシステムのファイル探索アルゴリズムに依存すると思います.

FreeBSD2.X(古い…)の例ですが、inodeを1ディレクトリで
2^15しか作れない上、ファイル数が1万5000を超えたあたり
からファイル探索(アクセス?)が劇的に遅くなったりするので、
他のOSでもそのあたりの事情は似たり寄ったりな気がします.

またユーザIDでテーブルを分けることによってテーブル数を
少なくする方法などが提案されていますが、ディレクトリの
メタ情報を格納しているファイルが肥大化してしまってるは
ずなので、単にテーブル数を少なくしてもパフォーマンス
改善は望めない可能性があります.状況が許すなら(とても
大事な点です)、いったんディレクトリをきれいにする必要が
あるでしょう.

ターンアラウンドタイムや全決済履歴テーブルがどれくらいの
レコード数かはわからないのですが、数百万のオーダなら最初の
バージョンの時点で上手にインデックス張って、SQLを見直す
程度で解決だったのでは?と個人的には思います.あとはせいぜい
ディスクの配置くらいかな?

やまざき



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