Zapytanie czy dodatkowa kolumna w bazie

witam
mam table questions gdzie jest kilkadziesiąt pytań i answers gdzie jest kolo 200k rekordów. Kazde pole w answers ma response_id (responses to inna tabela) oraz question id. Chciałbym dostac ilosc odpowiedzi dla danego response id. Mam taką funkcje w modelu Question

def responses_count answers.count(:response_id, :distinct => true) end
co dla kazdego pytania daje sqla

Nie wiem czy jest to optymalne rozwiazanie, czy nie lepiej dodac kolumne respones_count

ps: Czy ruby nie zwalnia pamieci raz zajętej przez wynik zapytania ? z tego co zauwazyłem jesli zuzycie pamieci dla danej podstrony mi wzrosnie, to potem juz nie spada, to akurat na Webricku na localu, nie wiem jak na serwerze.

Co do zwalniania pamięci: Ruby Enterprise Edition ZTCW ma konfigurowalnego GC

Nie jest optymalne. Lepiej dodać kolumnę. Railsy nawet potrafią to obsłużyć z automatu, poszukaj opcji counter_cache w dokumentacji ActiveRecord::Associations::ClassMethods :slight_smile:

znalazłem powód wycieków pamieci :slight_smile: aplikacje robiłem chwile temu gdy uczyłem się railsów, dawałem @duzo_rekordow.length zamiast .count, w tym pierwszym wypadku zwraca całą kolekcje obiektów i liczy jej rozmiar, w 2gim liczeniem zajmuje sie baza.

@Artur79 wiele osób się na to nabiera :slight_smile:

Najbezpieczniej chyba korzystac z .size. Jezeli nie korzystasz z counter cache to nie ma roznicy miedzy .size a .count, przy uzywaniu counter cache .size bedzie pobierac wartosc z cache natomiast .count zawsze wykona COUNT na bazie. Poprawcie mnie jezeli sie myle. :wink:

tutaj ciekawy wpis na ten temat http://breakthebit.org/post/3487560245/rails-3-arel-count-size-length-weirdness