3

私は Postgres に比較的慣れていませんが、奇妙なエラーが発生し、Google で調べても何も見つかりませんでした。

それぞれ約 2 億行の 2 つの (比較的大きな) テーブルを作成しました。1 つ目は 4 行、2 つ目は 3 行です。それらはそれぞれ、各列に varchar を格納しています。

2 つのテーブルを結合し、結果の列の 3 つを選択して、3 番目のテーブルを作成しようとしています。クエリは次のとおりです。

create table table_C as 
(select table_A.id as id, table_A.predicate, table_B.object as type 
from table_A join table_B on 
table_A.subject = table_B.subject);

クエリは約 10 時間実行され、その後中止されます。

ERROR:  could not extend file "base/446695/504075.302": No space left on device
HINT:  Check free disk space.

64 GB の RAM を搭載した Amazon EC2 インスタンスでこれを実行しており、データベースは最大 500 GB の空きボリュームに保存されています。結果のテーブルは大きくなるはずですが、元の 2 つのテーブルは 100GB 未満しか占有しないため、2 つの列を持つテーブルが 5 倍以上のスペースを占有するのは奇妙です。約 4 回試行し、インスタンスを再起動しようとしました。

データ ディレクトリと pg_stats_tmp ファイルの両方が正しいボリュームを指していることを再確認しました。(postgres.conf の「data_dir」と「pg_stat_tmp」の両方の設定)。

何かご意見は?どこかにバルーニングしている可能性のある他の一時ファイルはありますか (ルートボリュームには 150GB 以上の空き容量があります)。

4

1 に答える 1

1

サブジェクトが重複している場合、結合は行の組み合わせを繰り返します。

例えば

表1

  1. 件名1
  2. 件名1
  3. 件名1
  4. 件名2

表2

  1. 件名1
  2. 件名1
  3. 件名2
  4. 件名2

結果は Subject1 で 6 時間、Subject2 で 2 行 (合計 8​​ 行) になります。

最も極端なケースでは、被験者がまったく同じで、200 mln * 200 mln 行になります。

それが理由だと思います...

于 2012-07-19T19:26:29.133 に答える