何が良いのかわかりません。質問に答えるか、更新してください...だから私は答えることを選びます。更新したほうがいいかどうか教えてください
私たちはついに問題を見つけました。バージョン3.1以降、RailsはUser.find(id)のような単純なリクエストでプリペアドステートメントを追加しました。バージョン4.0、アソシエーション(has_many、belongs_to、has_one)のリクエストにプリペアドステートメントを追加しました。たとえば、次のコードの場合:
class User
has_many :adresses
end
user.addresses
リクエストの生成
SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1 [["user_id", 1]]
問題は、Railsが外部キー(ここではuser_id)のプリペアドステートメント変数のみを追加することです。
のようなカスタムSQLリクエストを使用する場合user.addresses.where("moved_at < ?", Time.now - 3.month)
moved_atのプリペアドステートメントに変数は追加されません。そのため、リクエストが呼び出されるたびにプリペアドステートメントが生成されます。 Railsは、最大サイズ1000のプールでプリペアドステートメントを処理します。
ただし、postgresqlのプリペアドステートメントは接続間で共有されないため、1時間または2時間で、各接続に1000のプリペアドステートメントがあります。それらのいくつかは非常に大きいです。これにより、postgreqslサーバーで非常に高いメモリ消費が発生します。