[pgsql-jp: 33495] Re: select文でセグメンテーション違反

FUKUSHIMA Katsuaki kfukushima @ sis.seino.co.jp
2004年 7月 5日 (月) 15:06:51 JST


 福島@初投稿です。

On Mon, 5 Jul 2004 13:57:35 +0900
"Hitoshi Taniguchi" <taniguchi @ chihaya-t3.co.jp> wrote:

> 谷口@質問者です。
> 
> > SELECT count(*) FROM test50m ORDER BY key1;
> は、以下のメッセージがでて実行できませんでした。
> Attribute test50m.key1 must be GROUPed or used in an aggregate function
> もちろん、石井殿の意図は分かりましたので以下をテストしてOKでした。
> SELECT count(*) FROM test50m;
> さらに、以下もOKでした。
> SELECT key1 FROM test50m;
> SELECT key1 FROM test50m ORDER BY key1;
> つまり、SORT等の処理が終了した後、結果を全てpsqlに取り込み
> その時点で、メモリのオーバーフローになるということだと理解できます。
> そこまでは、私も理解できるのですが、実際にはそう単純でも無いようです。
> SELECT * FROM test50m; でエラーになるのが理解できません。

 メモリオーバーフローの問題に関して kernel パラメータや postgresql.conf 
等を調整して解決されようとしていらっしゃるようですが、今回発生している問
題は、クライアント側で発生しているメモリオーバーフローですので、無意味だ
と思います。

 最初の投稿で、使用しているマシンの CPU が XeonMP ということでしたので、
ia32 アーキテクチャの制限として、通常の kernel を使用しているのであれば、
プロセス毎に 3GB のユーザスペース、hugemem kernel を使用したとしても 4GB 
のユーザスペースしかありません。これを超えるような結果セットを psql が 
postmaster から受け取ろうとしてオーバーフローしたと考えられます。

CREATE TABLE test1m(
    key1    char(5),
    key2    char(5),
    key3    char(5),
    key4    char(5),
    pad     char(80)
);
ということでしたので、
SELECT key1 FROM test50m;
SELECT key1 FROM test50m ORDER BY key1;
上記2つがエラーにならなくて、
SELECT * FROM test50m;
これがエラーになるのは、psql が取り込もうとしているデータ量を計算してみ
ればわかるかと思います。

 解決策はいくつかあるのですが、それ以前にお聞きしたいことがあるのですが、
どのようなデータ分析を行おうと考えられているのでしょうか?条件無しで全件
を抽出するということがデータ分析を行う上で頻繁に必要になるのでしょうか?

 解決策ですが、ユーザスペースが広い 64bitプロセッサマシンに乗り換えるっ
ていうのは現実的ではないので、いくつかあげてみます。

 LIMIT OFFSET を用いて、ユーザスペースに到達しない範囲で、何度かに分け
てデータ抽出を行う。

 psql で処理を行うのでなく、ユーザアプリを書くのであれば、CURSOR を利用
して、データをこまめに抽出するようにする。

 といったところではないでしょうか。

---------------------------------------------------------
FUKUSHIMA Katsuaki at Seino Information Service Co., Ltd.
e-mail   kfukushima @ sis.seino.co.jp




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