Rails-生成的查询需要数千秒

Rails-generated query takes thousands of seconds

我在 New Relic 中看到此查询需要数千秒:

SELECT "apps".* FROM "apps" WHERE "apps"."listing_id" =  ORDER BY "apps"."id" ASC LIMIT 1

它只会破坏我的表现。 table 很糟糕,因为它有 50 多个非常稀疏的列和大约 5000 万行。

listing_id 已编入索引。这是一个 PostgreSQL 数据库,除了允许它每天被 auto vacuum 编辑外,我几乎什么也没做。

但我不知道去哪里寻找可以使查询执行得更快。此查询由 ActiveRecord 生成。看起来它可能只是用来获取备份我的模型的 table 的属性。有没有办法缓存它,这样我就不必查询 运行?

或者我还能做些什么来制作这个 "performant"?请注意,我在 SE DBA 网站上以稍微不同的方式问过同样的问题,因此我不需要重新分类这个问题。我在这里的重点是找出 AR 生成此查询的原因,以及我可以做些什么来改变它或使其更有效地应对 table.

这样的无赖

问题是您正在寻找最小的 apps.id,而它不是索引的一部分。所以必须读取所有匹配的行来获取id,然后进行排序。我怀疑这需要时间。

[listing_id, id] 上的复合索引应该可以解决问题。

SELECT "apps".* FROM "apps"
 WHERE "apps"."listing_id" =  ORDER BY "apps"."id" ASC LIMIT 1

在rails中可以通过一系列语句生成

你可以

  • App.where(listing_id: X).first
  • a_listing.apps.first

所以你可以找这两个。