Не знам кое е по-добре:да отговорите на въпроса ми или да го актуализирате ... затова избирам да отговоря. Моля, уведомете ме дали е по-добре да актуализирам
Най-накрая откриваме проблема. От версия 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 обаче не се споделят през връзката, така че за един или два часа всяка връзка има 1000 подготвени израза. Някои от тях са много големи. Това води до много висока консумация на памет на postgreqsl сървъра.