Nie wiem, co jest lepsze:odpowiedz na moje pytanie lub zaktualizuj je ... więc postanawiam odpowiedzieć. Daj mi znać, jeśli lepiej zaktualizować
W końcu dowiadujemy się o problemie. Od wersji 3.1 Railsy dodały gotowe instrukcje na proste żądanie, takie jak User.find(id). Wersja 4.0, dodała przygotowane zestawienia do żądań dotyczących skojarzeń (has_many, among_to, has_one). Na przykład następujący kod:
class User
has_many :adresses
end
user.addresses
wygeneruj żądanie
SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1 [["user_id", 1]]
Problem polega na tym, że Railsy dodają tylko przygotowane zmienne instrukcji dla kluczy obcych (tutaj user_id). Jeśli używasz niestandardowego żądania sql, takiego jak
user.addresses.where("moved_at < ?", Time.now - 3.month)
nie doda zmiennej do przygotowanych instrukcji dla move_at. Generuje więc przygotowane zestawienia przy każdym wywołaniu żądania. Railsy obsługują przygotowane instrukcje z pulą o maksymalnym rozmiarze 1000.
Jednak przygotowane instrukcje postgresql nie są udostępniane przez połączenie, więc w ciągu jednej lub dwóch godzin każde połączenie ma 1000 przygotowanych instrukcji. Niektóre z nich są bardzo duże. Prowadzi to do bardzo dużego zużycia pamięci na serwerze postgreqsl.