如何使用条件计算表的大小

时间:2010-03-30 19:04:20

标签: mysql ruby-on-rails postgresql

如何使用限制来计算MySQL或PostgreSQL中的表大小? 例如: WHERE organisation_id=1

5 个答案:

答案 0 :(得分:2)

在PostgreSQL中你不能。数据存储在块中(每个块通常为8kb),您不知道在哪个块中存储了“organisation_id = 1”的记录。当所有记录都在一个块中时,它是8kb。当100个记录存储在100个块中时,它是800kb,但也包括其他记录。

你可以用隐藏的列“ctid”做一些魔术,但这是很多工作,不准确,也不是很有用。只需使用pg_relation_size()来获取整个表,这就是您所需要的。如果需要TOAST表包含,请使用pg_total_relation_size()。

答案 1 :(得分:2)

ModelName.count(:conditions => {:organisation_id => 1})

答案 2 :(得分: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,这种事情与数据库无关。

答案 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

答案 4 :(得分:0)

更短的版本

ModelName.count(:organisation_id => 1)