sql >> Databáze >  >> RDS >> PostgreSQL

Úniky paměti na postgresql serveru po upgradu na Rails 4

Nevím, co je lepší:odpovědět na mou otázku nebo ji aktualizovat ... tak se rozhodnu odpovědět. Dejte mi prosím vědět, zda je lepší aktualizovat

Konečně zjišťujeme problém. Od verze 3.1 přidával Rails připravené příkazy na jednoduchý požadavek jako User.find(id). Verze 4.0 přidala připravené příkazy k žádostem o přidružení (has_many, include_to, has_one). Například následující kód:

class User
  has_many :adresses
end
user.addresses

vygenerovat požadavek

SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1  [["user_id", 1]]

Problém je v tom, že Rails přidává pouze připravené proměnné příkazu pro cizí klíče (zde user_id). Pokud používáte vlastní požadavek SQL, jako je

user.addresses.where("moved_at < ?", Time.now - 3.month) 

nepřidá proměnnou do připravených příkazů pro move_at. Takže generuje připravené výpisy pokaždé, když je požadavek volán. Rails zpracovává připravené příkazy s fondem o maximální velikosti 1000.

Připravené příkazy postgresql však nejsou sdíleny napříč připojením, takže za jednu nebo dvě hodiny má každé připojení 1000 připravených příkazů. Některé z nich jsou velmi velké. To vedlo k velmi vysoké spotřebě paměti na postgreqsl serveru.




  1. Proveďte alembický upgrade ve více schématech

  2. Vytvoření funkce v Postgresql, která nevrací složené hodnoty

  3. Upravený dotaz pomocí ManyToMany

  4. SQL spojení 2 tabulek do 1 tabulky