web-dev-qa-db-ja.com

Postgres「ハッシュ結合一時ファイルに書き込めませんでした:デバイスにスペースが残っていません」

しばらく前にこのエラーが発生していて、2つのことに興味がありました-

1-このメッセージが最初に発生する原因となるpostgresの内部はどのように機能しますか?データベースが作成する一時ファイルの作成に関して、ハッシュ結合とは何ですか?データベースのメモリ割り当ての範囲外の一時ファイルの作成に関連していることはわかっていますが、なぜハッシュ結合と呼ばれるのかはわかりません。

2-将来発生するこのようなエラー(パフォーマンスとメモリに関連する)をどのように予測および防止できますか?

6
noname

1-このメッセージが最初に発生する原因となるpostgresの内部はどのように機能しますか?

2つの非常に大きなデータセットを結合する場合、PostgreSQLが使用できる1つの戦略は、1つのテーブルをスキャンしてその結合列をハッシュすることです。次に、他のテーブルをスキャンし、結合列のハッシュを2番目のテーブルに対して計算されたハッシュと比較します。

参照 https://en.wikipedia.org/wiki/Hash_join

小さなテーブルをはるかに大きなテーブルに結合する場合、特に結合条件に適したインデックスがない場合は、これは非常にうまく機能します。

PostgreSQLは、ハッシュテーブルパーティションを最初にディスクに書き込む大きなテーブルに対して、ハッシュ結合戦略を使用できます。これはおそらくあなたが得たものです。

データベースが作成する一時ファイルの作成に関して、ハッシュ結合とは何ですか?

ハッシュテーブル。この質問はよくわかりません。

2-将来発生するこのようなエラー(パフォーマンスとメモリに関連する)をどのように予測および防止できますか?

一時的なストレージ用に、より多くの予備のディスク容量を用意してください。メインのテーブルスペースにある必要はありません。 temp_tablespaces設定。

私の知る限り、PostgreSQLにはハッシュテーブルのサイズを見積もることができず、ハッシュテーブルが利用可能なディスク領域に対して大きすぎると判断する能力がありません。

6
Craig Ringer