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
所以你可以找这两个。
我在 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
所以你可以找这两个。