[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 メーリングリストの案内