首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮我优化属性太多的ActiveRecord对象

帮我优化属性太多的ActiveRecord对象
EN

Stack Overflow用户
提问于 2011-08-31 22:32:24
回答 3查看 510关注 0票数 1

我正在开发一个连接到遗留数据库的应用程序。主要模型基于一个非常大的100+列表。我对ActiveRecord的内部工作原理了解不多,但在我看来,这个模型上的任何请求都变慢了,因为它正在创建具有100+属性的对象。让我们称其为SlowModel。

在我的dev计算机上,使用这种模型渲染页面有时需要17秒。直接的mysql查询只需要0.5 -1秒。

我已经设法通过使用选择字段子集(20个左右)的MySQL视图来加速应用程序的一部分。我们将其称为QuickModel。使用视图是可以的,但不是最便携的解决方案。

我可能会继续尝试将这个QuickModel添加到站点的其他部分,但我想知道是否有人有其他想法来加速原始对象。例如,有没有一种方法可以在模型中指定activerecord应该忽略和避免构建的列?可能有特定的列类型(:text??)这会导致ActiveRecord对象膨胀。

假设列有适当的索引。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-31 23:23:23

如果有一个全新的QuickModel,它位于自己的表中……和一台QuickModel has_one SlowModel?

您可以使用SQL将最需要的数据移动到QuickModel表中,并且仅在必要时使用my_quick_model.slow_model引用SlowModel。

或者,您可以向默认作用域添加"select“(您可以搜索"rails默认作用域”以获取更多信息)。默认情况下,它只获取精简集-但您可以通过传递以下命令来请求所有属性:如果需要,请选择=> "*“。

票数 1
EN

Stack Overflow用户

发布于 2011-08-31 23:20:23

您可以使用ActiveRecord查找的:select选项指定在模型查找中返回哪些列:

代码语言:javascript
复制
SlowModel.all(:select => 'id, col1, col2, col3')

...will加载仅填充了指定列的SlowModel实例。

票数 6
EN

Stack Overflow用户

发布于 2011-09-01 10:29:03

按照Winfield所说的思路,您可能希望了解一下如何使用像SlimScrooge这样的属性跟踪器。跟踪器尝试只获取您正在使用的数据,这降低了开销。它试图自动执行Winfield建议的操作。

自述文件中的示例:

代码语言:javascript
复制
# 1st request, sql is unchanged but columns accesses are recorded
Brochure Load SlimScrooged 1st time (27.1ms)   SELECT * FROM `brochures` WHERE (expires_at IS NULL)

# 2nd request, only fetch columns that were used the first time
Brochure Load SlimScrooged (4.5ms)   SELECT `brochures`.expires_at,`brochures`.operator_id,`brochures`.id FROM `brochures` WHERE (expires_at IS NULL)

# 2nd request, later in code we need another column which causes a reload of all remaining columns
Brochure Reload SlimScrooged (0.6ms) `brochures`.name,`brochures`.comment,`brochures`.image_height,`brochures`.id, `brochures`.tel,`brochures`.long_comment,`brochures`.image_name,`brochures`.image_width FROM `brochures` WHERE `brochures`.id IN ('5646','5476','4562','3456','4567','7355')

# 3rd request
Brochure Load SlimScrooged (4.5ms)   SELECT `brochures`.expires_at,`brochures`.operator_id,`brochures`.name, `brochures`.id FROM `brochures` WHERE (expires_at IS NULL)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7258529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档