DesignAssembler

備忘録に近い

sizeとcountの違い

activerecordで取得したレコードの数を調べるときにcountとsizeを使ったら速度にかなりの差が出たのでその違いを調べました。

countとsizeの差はそのレコードがロードされているか否かで変わります。

レコードがロードされている時、countはsqlを生成し、sizeはsqlを生成しません。つまり、sizeの方が高速です。

a = Article.first.tags

a.count
   (0.4ms)  SELECT COUNT(*) FROM `tags` INNER JOIN `articles_tags` ON `tags`.`id` = `articles_tags`.`tag_id` WHERE `articles_tags`.`article_id` = 1
=> 1

a.size
=> 1

レコードがロードされていない時はどちらもcountのsqlを生成します。

Article.first.tags.count
  Article Load (0.3ms)  SELECT  `articles`.* FROM `articles`  ORDER BY `articles`.`id` ASC LIMIT 1
   (0.5ms)  SELECT COUNT(*) FROM `tags` INNER JOIN `articles_tags` ON `tags`.`id` = `articles_tags`.`tag_id` WHERE `articles_tags`.`article_id` = 1
=> 1

Article.first.tags.size
  Article Load (0.3ms)  SELECT  `articles`.* FROM `articles`  ORDER BY `articles`.`id` ASC LIMIT 1
   (0.3ms)  SELECT COUNT(*) FROM `tags` INNER JOIN `articles_tags` ON `tags`.`id` = `articles_tags`.`tag_id` WHERE `articles_tags`.`article_id` = 1
=> 1

条件を付けたい時はcountを使い、他はだいたいsizeで事足りるようです。

参考

http://apidock.com/rails/ActiveRecord/Associations/AssociationCollection/size