ruby-on-rails 慢ActiveRecord查询之谜

dddzy1tm  于 2023-06-07  发布在  Ruby
关注(0)|答案(1)|浏览(225)

这个问题与使用Searchkick(使用Opensearch)和PostgreSQL的仅Rails API应用程序有关。一些结果需要很长时间才能渲染,根据开发日志,我看到了类似这样的东西:
Opensearch查询时间:10 ms,Postgres查询时间:7500 ms(这是一个“select * from records where id in(1,2,...1000,1001...)”)。JSON渲染时间:10 ms,总时间:12000ms。
看来有些事情需要额外的时间。它不下载资源,Rails应用程序也不进行任何外部查询。
我试着在最初的Searchkick查询中设置load: false,以避免7.5秒的Postgres查找,这导致整个事情在浏览器中花费了大约60秒!
下面是在控制台中执行的此类查询的示例:

3.1.2 :020 > results = Record.search('*', where: { _and: [{:record_type=>["repository", "knowledgebase", "knowledgebase_and_repository"]}]}, load: false)
  Record Search (14602.0ms)  records_development/_search {"query":{"bool":{"must":{"match_all":{}},"filter":[{"bool":{"must":[{"bool":{"filter":[{"terms":{"record_type":["repository","knowledgebase","knowledgebase_and_repository"]}}]}}]}}]}},"timeout":"11000ms","size":10000}

 => #<Searchkick::Relation [#<Searchkick::HashWrapper _id="1809" _index="records_development_20221206123449093" _score=1.0 abbreviation="RNAiDB...
3.1.2 :021 > results.took
 => 638

Searchkick报告的638 ms(可能是Opensearch所用的时间)和14602 ms之间存在差异。我猜它比浏览器中的60秒要快,因为它是在一个没有任何控制器的控制台中,但是Rails堆栈中似乎有一些东西真的会减慢速度。
在这一点上,我不确定的最好的方法来找出什么。

x0fgdtte

x0fgdtte1#

进一步的调查让我想到了Rails Mini Profiler:
https://github.com/hschne/rails-mini-profiler
经过一些问题 * 我能够看看冒犯的请求。正如我所预料的,有两个问题:
1.上面提到的select * from records where id in (...)查询。这是Searchkick干的

  1. GraphQL记录类型的初始化,它 Package 了由该查询生成的数据。
    第2步是一个循环,虽然每次都很短,但每次都有2k+条记录和3-4个GraphQL对象被创建。
    因此,如何处理(除了投入更多的处理能力)目前还不清楚。
    (*)application.rb中缺少sprocket/railtie需求,需要config.middleware.use ActionDispatch::Flash到config/environments/development.rb,最后,在运行几个查询后修改数据库,将user_id从::1更改为127.0.0.1(以获得结果并显示在分析器页面上)。

相关问题