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_transaction
2) (ヒントによると) 64 よりも高い値を取得した場合、Postgres サーバーが起動しないのはなぜですか?
3) 「共有メモリ不足」エラーに遭遇せずに多くのビューを作成するにはどうすればよいですか?