2012-04-14 52 views
0

两个看似相同的查询(只要像我这样的新手就能看出来,但首先是更快的整体的局部模板渲染时间(没什么改变,但IDS语句)。此外,通过轨控制台进行测试时,后者将。明显地运行一个查询,前者会不是我不明白,为什么 - 为什么第一条语句是几毫秒比第二快 - 虽然我想这是由于较短的方法链接来获得相同的结果。两个(看似)相同的查询,其中一个更快,为什么?

更新:我的不好,他们没有运行相同的查询,但仍然很有趣,所有列上的select都比一列上的select更快,可能与链接方法相比,可以忽略不计。

ids = current_user.activities.map(&:person_id).reverse 
SELECT "activities".* FROM "activities" WHERE "activities"."user_id" = 1 
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (7.4ms) 


ids = current_user.activities.order('id DESC').select{person_id}.map(&:person_id) 
SELECT "activities"."person_id" FROM "activities" WHERE "activities"."user_id" = 1 ORDER BY id DESC  
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (10.3ms) 

声明的目的是为了获取在它们的活动表中出现,(在其PK)的顺序外键引用的人。 注意:我使用SQL的Squeel

+1

什么是'select {person_id}'的意思? – 2012-04-14 08:00:49

+1

我不知道答案是肯定的,这就是为什么我只是留下评论,但我的猜测是,arel只是更快地编译第一个。您可以使用像'IDS = current_user.activities.reverse_order.pluck得到它更快(:为person_id)'' – x1a4 2012-04-14 08:01:36

+0

选择{为person_id}'只是提炼的结果,用'person_id'忽略所有其他列。 – Jonathan 2012-04-14 08:06:38

回答

1

在第一个查询中,您链接了.map和.reverse,而在第二个查询中,您使用了.order('id DESC').select(person_id),如果您添加了,它们是不必要的。反向

+0

好一点,其实我从订货到'created_at',因为他们基本上没有在这种情况下同样的事情改变了,忘了,相反是反正这样做。好点 – Jonathan 2012-04-14 08:09:12

+0

我将查询优化为'ids = current_user.activities.select(:person_id).map(&:person_id).reverse',谢谢指出 – Jonathan 2012-04-14 08:39:01

相关问题