【问题标题】:debugging a rails controller making too many queries调试 Rails 控制器进行太多查询
【发布时间】:2009-04-30 19:06:28
【问题描述】:

我有一个使用了大约 3 年的 Rails 应用程序,但我的页面查询过多时遇到了问题。每个加载的页面都有几行如下所示:

ReqTdsLink Columns (1.0ms)   SHOW FIELDS FROM `req_tds_links`

什么样的方法调用会在日志中产生这个输出?我找不到任何之前的过滤器,或者应用程序控制器中可能导致这种情况的任何其他东西,但我还没有检查所有的视图(数量上是天文数字)我开始手动扫描每个文件以查找可能导致此问题的原因。

谢谢,

-C

【问题讨论】:

  • 你没有说你使用的是什么版本的 Rails/ActiveRecord。 ActiveRecord 在 3 年内发生了很大变化,在查询缓存和查询优化方面有了很大改进。

标签: ruby-on-rails ruby debugging logging


【解决方案1】:

您是在开发模式还是生产模式下运行?

SHOW FIELDS FROM foo 由您的模型完成,正如您所指出的,因此它知道要生成哪些访问器方法。

在开发模式下,每个请求都会执行此操作,因此您不需要经常重新加载网络服务器,但在生产模式下,即使您运行的是三年前的 Rails 版本,也应该缓存这些信息。

【讨论】:

  • 这在我现在所处的 Rails 2.1.2 中当然是正确的。
【解决方案2】:

这由 ActiveRecord 调用,从您的数据库中读取模型的属性。它不会在生产中发生多次,但在开发模式下,Rails 每次都会查询表以了解可能发生的任何更改。

【讨论】:

    【解决方案3】:

    如果您再次遇到此类问题并需要跟踪查询是如何被调用的,我建议您使用 Query Trace 插件:http://github.com/ntalbott/query_trace/tree/master。它将堆栈跟踪添加到每个 SQL 查询的日志中。非常方便。

    【讨论】:

      【解决方案4】:

      这一行实际上来自调用模型,我在应用程序控制器中有一个看起来像 [Model1, Model2, Model3] 的数组,我将它更改为看起来像 ['Model1','Model2', 'Model3']并且修复了所有额外的调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2012-12-08
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多