- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
ActiveRecord 除了其简洁、可读的语法之外还有其他好处吗?是不是ActiveRecord比纯SQL占用内存多? (我正在使用 PostgreSQL。)
我读过 Alexander Dymo 的 blog post on Rails performance ActiveRecord 占用的内存比纯 SQL 多:
It's easy to manipulate the data with ActiveRecord. But ActiveRecord is essentially a wrapper on top of your data. If you have a 1G of data in the table, ActiveRecord representation of it will take 2G and, in some cases, more. Yes, in 90% of cases that overhead is justified by extra convenience that you get. But sometimes you don't need it.
我还阅读了 the documentation ActiveRecord 是“更好的”:
If you're used to using raw SQL to find database records, then you will generally find that there are better ways to carry out the same operations in Rails. Active Record insulates you from the need to use SQL in most cases.
我在 Heroku 上一直遇到 Error R14 (Memory quota exceeded)
,所以为了解决这个问题,我了解了膨胀和内存泄漏。我已经确定了一些改进方法,包括急切加载 ActiveRecord 数据,如 List.joins(:quantities).find(@list_id)
,以及减少对数据库的整体调用。但我仍然渴望记忆。
如果ActiveRecord的好处只是更容易编写,那么我会尽可能地编写纯SQL。但我希望 SO 社区可以对权衡发表评论并填补我理解中的任何空白,特别是如果我在放弃 AR 之前应该三思而后行的话。
完全摆脱 AR 会很糟糕吗?
最佳答案
您需要查看该博文的下一段以获取一些上下文:
One example where you can avoid ActiveRecord's overhead is bulk updates. The code below will neither instantiate any model nor run validations and callbacks.
Book.where('title LIKE ?', '%Rails%').update_all(author: 'David')
作者并不是说您应该使用原始 SQL 将数据(作为一堆哈希)拉入 Rails 而不是使用 ActiveRecord 将数据拉入 Rails(作为一堆模型),他们是说您不应该从数据中提取一堆数据,在 Rails 中对其进行操作,然后在可以将所有工作直接推送到数据库中时将其放回原处。
考虑以下之间的区别:
Book.where('title LIKE ?', '%Rails%').update_all(author: 'David')
和
Book.where('title LIKE ?', '%Rails%').each do |b|
b.update(author: 'David')
end
第一个简单地向数据库发送一些 SQL:
update books
set author = 'David'
where title like '%Rails%'
并让数据库完成所有工作。几乎没有任何数据在数据库和您的 Rails 应用程序之间移动,您的应用程序为此几乎不使用任何内存,并且您的应用程序为此几乎不做任何工作/CPU。
第二个从数据库中拉出一堆行,创建一堆 ActiveRecord 模型,运行一堆 Ruby 代码(创建模型,设置一个值,运行验证,...),然后发送一堆单行 SQL UPDATE 返回数据库。此版本通过网络传输更多数据,在 Rails 中使用更多内存,并使用更多 CPU 来运行更多 Ruby 代码。
消息不是“不要使用 ActiveRecord”,消息是将您的数据操作逻辑放在正确的位置,而不是教条地在 Rails 中做所有事情,因为您在某处听说过“数据库中没有逻辑”。
ActiveRecord 的内存问题通常来自实例化太多模型。如果您说的是 Model.all
,那么您可能做错了。如果您试图在 Rails 中同时操作多个模型,那么您可能做错了。 ORM 非常适合处理单个模型,但不适合批量操作。
如果您下拉到该博文的第 2.2 节:
Sometimes the task at hand is better done with other tools. Most commonly it's a database. Why? Because Ruby is bad at processing large data sets. Like, very very bad. Remember, Ruby takes a large memory footprint. So, for example, to process 1G of data you might need 3G and more of memory. It will take several dozen seconds to garbage collect 3G. Good database can process the data in under a second. Let me show a few examples.
你会看到博客的作者说了同样的话。
关于sql - 我可以通过编写 SQL 而不是 ActiveRecord 来节省内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882807/
我想知道如何使用 CaSTLe AR 来“播种”自动递增的主键值?例如,希望 Orders 表的主键从 10000 开始。这是 1. 可能的 2. 创建订单号的好解决方案吗? 也许有一种方法可以在不是
假设你想 records = Model.all records.to_a.map{|m| m.serializable_hash(:root => true)} 就像 to_json(:root =
我目前正在尝试开发一个插件/gem 来观察多个模型。理想情况下,观察者应该只用一个单例方法自动实例化...... class MyModel true observe ActiveRecord:
使用 Mysql 我可以使用 COALESCE仅更新表中为空的值。 我怎样才能用 Rails (ActiveRecord) 做到这一点? 我不想创建 if表中每一列的语句,我猜如果我将 ActiveR
我从 Yii2 开始,想要将一些内容保存到我的数据库中。这是我的模型: class Course extends ActiveRecord { public $name; public
我正在开始一个新项目,最近我发现了 caSTLe 项目 activerecord,这似乎是一个很棒的解决方案,但与此同时,它看起来确实是非常规的。我想知道,这种感觉是来自学习新东西(我应该习惯它)还是
不知何故,我总是在周五收到这些。 我之前的问题是关于同样的问题,但我现在可以缩小范围: 我一整天都在研究这个问题,试图理解它。我有一个带有 lock_version 列的表,如此指定: add_col
我正在使用表中缓存的关键字构建搜索。在表中查找用户输入的关键字之前,它会被规范化。例如,删除了一些标点符号,如“-”,并标准化了大小写。然后使用规范化的关键字来查找获取搜索结果。 我目前正在使用 be
我有以下类用于“项目”和“颜色”之间的多对多关系。 并且“项目”不应该有重复的“颜色”,例如:-如果“Item1”有“Blue”和“Red”,那么我们不能向“Item1”添加另一个“Red” 这是正确
我对 Yii2 事件记录处理关系属性的方式感到困惑。是否可以将事件记录对象链接到另一个对象而不先保存它? 例如,我想将图像作为 Logo 添加到公司记录中,但尚未决定是否应保存这两个记录。给定一家公司
我决定使用 Castle ActiveRecord 为客户制作一个系统,一切都很顺利,直到我发现交易不起作用,例如; TransactionScope t = new T
Yii2 的新特性。 只是试图从 ActiveRecord 查询中获得返回。我意识到使用 Yii2 约定可能有更简单的方法来做到这一点 public function actionGet_permis
我收到一个错误(在 Sinatra + ActiveRecord Heroku 上)数据库配置没有指定适配器。 根据一些研究,这似乎是因为 Heroku 预计在 rackup 期间不使用环境变量。 我
我正在尝试按“created_at”日期查找记录 - 数据库列类型为“日期时间”并且 我正在使用来自 jQuery 的 UI DatePicker 我的网址如下所示:“localhost:3000/u
我想问这个问题。但我认为 BlameableBehavior和 TimestampBevavior可能是需要这样做的好例子: 我必须做什么才能使属性只能从 ActiveRecord 对象的外部读取而不
这是一个古老的问题,其中给定一个具有“类型”、“品种”和“价格”属性的表,您可以获取每种类型的最低价格的记录。 在 SQL 中,我们可以做 this通过: select f.type, f.varie
这似乎是一个微不足道的问题,但是我能想到的所有明显的解决方案都有自己的缺陷。 我们想要的是能够为新记录设置任何默认的 ActiveRecord 属性值,以使其在验证之前和期间可读并且不干扰用于搜索的派
做关联方法,比如has_many定义的那些和 belongs_to利用 ActiveRecord::Relation ? 如果是这样,是否有可能获得 ActiveRecord::Relation正在使
如何将 MySQL 的 WHERE 转换为 ActiveRecord :condition? SELECT * FROM users WHERE LENGTH(users.last_name) [
当使用带有 ActiveRecord T4 模板的 SubSonic 3 时,生成的代码会显示许多关于 CLS 合规性、未使用的项目和缺少 GetHashCode() 实现的警告。 为了避免它们,我做
我是一名优秀的程序员,十分优秀!