[pgsql-jp: 33492] Re: select文でセグメンテーション違反
Tatsuo Ishii
t-ishii @ sra.co.jp
2004年 7月 4日 (日) 20:45:44 JST
石井です.
> 谷口@質問者です。
>
> > > パラメータを論理的に調整してみる事からはじめませんか?
> > 一つずつ挑戦してみます。
> 色々と試してたところ、処理速度に変化は見られるものの
> ----------------------------------------------------------
> SELECT * FROM table_name ORDER BY key1,key2,key3,key4;
> server sent data ("D" message) without prior row description ("T" message)
> server sent data ("D" message) without prior row description ("T" message)
> ・・・延々と続きます
> セグメンテーション違反です
>
> 以上の様にして終了します。SELECTの実行から約30分後です。
> ----------------------------------------------------------
> の状況は、変化がありませんでした。
> カーネルとPostgreSQLの両方の設定を全て初期状態に
> 戻してみましたが結果は同じでした。
>
> ===============================
> <再度整理してみました>
> 大規模データ(100-200GB程度)のデータ分析に以下のサーバを
> スタンドアロンで使用するという単純な使用方法です。
> CPU: Xeon MP * 2CPU
> メモリ: 8GB
> OS: Red Hat Enterprise Linux ES Version 3
> PostgreSQL:Version 7.3.6
> ディスク:ext3(但し、raid5)で、700GB程度のユーザエリアで処理
>
> ===============================
> 問題を簡単にする為に以下のテストを行いました。
> DROP TABLE test1m;
> CREATE TABLE test1m(
> key1 char(5),
> key2 char(5),
> key3 char(5),
> key4 char(5),
> pad char(80)
> );
> ランダムな数字を作成して、test1mに百万件登録し、
> 同様にテーブル名をtest50mにして5千万件登録しました。
> 実際のテーブルサイズは別とすると、
> test1mには、約100MByteのデータ容量になり
> test50mには、約5GByteのデータ容量になります。
>
> psqlにより、以下の実験をしました。
> <test1mに対して>
> 1)SELECT * FROM test1m ORDER BY key1;
> 2)SELECT * FROM test1m ORDER BY key1 LIMIT 5;
> 3)SELECT * FROM test1m ORDER BY key1 OFFSET 999995;
> 4)SELECT * FROM test1m;
> 5)SELECT * FROM test1m LIMIT 5;
> 6)SELECT * FROM test1m OFFSET 999995;
> <test50mに対して>
> 7)SELECT * FROM test50m ORDER BY key1; <= ERROR *****
> 8)SELECT * FROM test50m ORDER BY key1 LIMIT 5;
> 9)SELECT * FROM test50m ORDER BY key1 OFFSET 999995;
> 10)SELECT * FROM test50m; <= ERROR *****
> 11)SELECT * FROM test50m LIMIT 5;
> 12)SELECT * FROM test50m OFFSET 49999995;
> 前述のエラーが出たのは、7)と10)でした。
psqlも同じホストで動かしているのですか?だったら7)とか10)がNGなのは当
然です.5GBのテーブルを全部psqlのメモリにコピーしようとしているんです
から.
たとえば,
SELECT count(*) FROM test50m ORDER BY key1;
とすればたぶんエラーにならないと思います.
あと,swapはどの位設定しているんですか?8GBのメモリを搭載しているのな
ら,その2倍の16GB以上は用意しないと,Linuxの場合仮想メモリを使い果たし
たときの動作が怪しくなると思います.
というわけで,アドバイスとしては,
o 処理中で使用しているメモリをきちんと計算
o 仮想メモリがその分用意されているかどうか考える
ということでしょうか.
--
Tatsuo Ishii
pgsql-jp メーリングリストの案内