Как подсчитать размер таблицы в MySQL или PosgreSQL с помощью ограничения? например: WHERE organisation_id=1
В PostgreSQL вы не можете. Данные хранятся в блоках (обычно по 8 кбайт каждый), и вы не знаете, в каком блоке хранятся записи с "organisation_id = 1". Когда все записи находятся в одном блоке, это 8kb. Когда 100 записей хранятся в 100 блоках, это 800kb, но это также включает и другие записи.
Вы можете сделать магию со скрытым столбцом "ctid", но это много работы, не точной и не очень полезной. Просто используйте pg_relation_size(), чтобы получить всю таблицу, что вам нужно. Если вам нужна таблица TOAST, используйте pg_total_relation_size().
ModelName.count(:conditions => {:organisation_id => 1})
Это зависит от вашей структуры таблицы. Если у вас есть все поля с фиксированной шириной, вы можете приблизиться. Если у вас есть поля переменной ширины, лучше всего вы сделаете оценку. Это для postgres.
SELECT pg_total_relation_size('my_table') * i / cnt
FROM (
SELECT SUM(CASE WHEN organization_id = 1 THEN 1 ELSE 0 END) AS i,
COUNT(1) AS cnt
FROM my_table
) sub
Если у вас есть ассоциации, созданные в ваших моделях следующим образом:
class Organisation < ActiveRecord::Base
has_many :members
end
class Member < ActiveRecord::Base
belongs_to :organisation
end
то вы можете узнать, сколько членов в организации 1 со следующим:
organisation = Organisation.find(1)
n_members = organisation.members.size
Благодаря ActiveRecord этот вид не зависит от базы данных.
organisation
это происходит так же, как в моем примере.
Даже более короткая версия
ModelName.count(:organisation_id => 1)