Rails生成的查询需要数千秒

时间:2016-04-14 17:31:33

标签: ruby-on-rails postgresql activerecord database-performance

我在New Relic中看到此查询需要花费数千秒的时间:

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

它只是破坏了我的表现。该表很糟糕,因为它有超过50个非常稀疏的列,大约有5000万行。

listing_id已编入索引。这是一个PostgreSQL数据库,我实际上什么也不做,只允许每天auto vacuum

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

或者我还能做些什么才能做到这一点"高性能"?请注意,我在SE DBA网站上提出的问题略有不同,所以我不需要重新分类这个问题。我在这里的重点是找出为什么AR会生成这个查询,并且我可以做些什么来改变它,或者让它更有效率来对抗这样一个无赖的表。

2 个答案:

答案 0 :(得分:1)

import QtQuick 2.3
import QtQuick.Window 2.2

Window {
    visible: true

    ToolbarButton {
        id: toolbarButton
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.topMargin: 10
        anchors.leftMargin: 10

        // Add signal handler directly to emitter
        onAddSaveHistory: dockWidget.text = "Button was clicked"
    }

    DockWidget {
        id: dockWidget
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 10
        anchors.left: parent.left
        anchors.leftMargin: 10
    }
}
rails中的

可以通过一系列语句生成。

你可以拥有

  • SELECT "apps".* FROM "apps" WHERE "apps"."listing_id" = $1 ORDER BY "apps"."id" ASC LIMIT 1
  • App.where(listing_id: X).first

所以你可以找这两个。

答案 1 :(得分:0)

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

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