1

Postgres の奇妙な動作を目撃しています。これが私がやっていることです:

以下のように10,000個の一時ビューを作成してみました

psqlStatement.executeUpdate("CREATE OR REPLACE TEMP VIEW " + symbols.get(i) + " AS SELECT * from persons;"); 

約 9000 ビューを作成した後、「共有メモリが不足しています。ヒント: max_locks_per_transaction を増やす必要があるかもしれません」というエラーが発生し始めました。

postgresql.confヒントを参考にして、ファイル内の値を 64 (デフォルト) から 100 に変更しました。この値を変更した後、Postgres サーバーを起動できませんでした。値を 64 または 65 に戻すと、サーバーが起動します。

この問題をさらに調査するために、10,000 ビューを作成する代わりに、8,000 ビューを作成しましたが、成功しました。Postgres コンソールを起動し、すべてのビューを表示するクエリを作成したところ、同じエラー (共有メモリが不足しています。ヒント: 可能性があります...)が再び発生しました。

要約すると、私は3つの奇妙なことを見ています:

1) 一時的なビューを作成し、(ビューを作成している) メイン メソッドが正常に終了したにもかかわらず、ビューがまだデータベースに存在するのはなぜですか? やった

SELECT count(*) from pg_views
WHERE schemaname NOT IN('information_schema', 'pg_catalog'); 

そしてそれは8,000を返しました。

max_locks_per_transaction2) (ヒントによると) 64 よりも高い値を取得した場合、Postgres サーバーが起動しないのはなぜですか?

3) 「共有メモリ不足」エラーに遭遇せずに多くのビューを作成するにはどうすればよいですか?

4

1 に答える 1

2

1) 一時的なビューを作成し、(ビューを作成している) メイン メソッドが正常に終了したにもかかわらず、ビューがまだデータベースに存在するのはなぜですか?

一時オブジェクトは、 (トランザクションだけでなく)セッションの間存続します。システム カタログからオブジェクトを論理的に削除するには、セッションを閉じるかオブジェクトを削除する必要があります。物理的には、死んだタプルはVACUUM FULL再利用されるまで残ります...)。

一時オブジェクトでさえ、(一時的ではない) システム カタログにエントリがあります。(これが、一時テーブル/ビューを作成するとディスク書き込みがトリガーされる理由です。) したがって、所有しているセッションが終了しない限り、どのSELECT count(*) from pg_viewsセッションからでもクエリを実行すると同じ数が得られます。

于 2012-08-22T19:53:42.800 に答える