Как я могу рассчитать размер таблицы, используя условие

0

Как подсчитать размер таблицы в MySQL или PosgreSQL с помощью ограничения? например: WHERE organisation_id=1

5 ответов

2

В PostgreSQL вы не можете. Данные хранятся в блоках (обычно по 8 кбайт каждый), и вы не знаете, в каком блоке хранятся записи с "organisation_id = 1". Когда все записи находятся в одном блоке, это 8kb. Когда 100 записей хранятся в 100 блоках, это 800kb, но это также включает и другие записи.

Вы можете сделать магию со скрытым столбцом "ctid", но это много работы, не точной и не очень полезной. Просто используйте pg_relation_size(), чтобы получить всю таблицу, что вам нужно. Если вам нужна таблица TOAST, используйте pg_total_relation_size().

2
ModelName.count(:conditions => {:organisation_id => 1})
  • 0
    Я думаю, что это может быть простое решение, тогда я могу умножить на количество байтов, необходимое для каждого столбца
  • 0
    Хм, я думаю, что мой ответ неверен. Он не дает размер таблицы, но считает количество строк в таблице.
Показать ещё 3 комментария
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
1

Если у вас есть ассоциации, созданные в ваших моделях следующим образом:

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 этот вид не зависит от базы данных.

  • 0
    метод подсчета будет намного быстрее
  • 0
    @ fl00r: это метод подсчета. После загрузки organisation это происходит так же, как в моем примере.
Показать ещё 1 комментарий
0

Даже более короткая версия

ModelName.count(:organisation_id => 1)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню