我想做以下事情:
Post.count.explain # doesn't work
此操作失败,因为EXPLAIN是关系上的方法,Post.count
不是关系。它只是一个常规整数,是查询的结果。那么计数查询怎么能被解释?
答案 0 :(得分:5)
这是一个生成完全相同的SQL查询的表单,但返回一个关系来调用explain
:
Post.select('count(*)').explain
两者都生成SQL
SELECT COUNT(*) FROM `posts`
...所以查询计划应该是相同的。
答案 1 :(得分:0)
COUNT不应该影响查询计划,因为它唯一的区别是告诉数据库获取行数据,但无论如何都需要找到行,不管是否有COUNT。
答案 2 :(得分:0)
从ActiveRecord::Relation#explain,我们可以使该方法接受一个块。
module ExplainBlock
def explain_block(&block)
exec_explain(collecting_queries_for_explain { instance_exec(&block) })
end
end
ActiveRecord::Relation.include(ExplainBlock)
然后Post.all.explain_block { count }
。