优化查询以获得更好的性能

Posted

技术标签:

【中文标题】优化查询以获得更好的性能【英文标题】:Optimize the query for better performance 【发布时间】:2017-12-13 16:03:31 【问题描述】:

所以我有这个功能。

假设我有 数百万 个帖子。

如何优化这个功能?

def fun
  Post.all.each do |post|
    if post.user.present?
       post.active = true
    else
       post.active = false
    end
    post.save
  end
end

喜欢用更少的行来获得更好的性能,因为这不是一个很好的方法。

【问题讨论】:

你可以在两个查询中做到这一点:1)Post.where(user_id: nil).update_all active: false 2)Post.where('user_id IS NOT NULL').update_all active: true。但它不会触发回调 Post.all 将为每条记录构建对象,这也会导致大量内存消耗 谢谢,这正是我需要的 @jeffdill2 我不知道。我想答案必须更全面。而且我认为有一种方法可以使用类似 sql case 语句的请求来完成此操作 顺便说一句@k00ka 给出了最好的选择 【参考方案1】:

这应该可以解决问题 - 而且速度很快...

Post.update_all("active = (user_id IS NOT NULL)")

【讨论】:

【参考方案2】:

这是另一个选项,它在两个查询中执行,没有任何原始 SQL(只是普通的 ol'Rails):

Post.where(user_id: nil).update_all(active: false)
Post.where.not(user_id: nil).update_all(active: true)

而且,不管你信不信,这实际上在数据库中运行的速度比在使用表达式 - active = (user_id IS NOT NULL) - 填充 active 的查询中运行得更快。

以下是在只有 20,000 条记录的表上测试的速度结果:

# Single (expression-based) query
<Benchmark::Tms:0x00007fd251a52780 @cstime=0.0, @cutime=0.0, @label="", @real=2.3656239999982063, @stime=0.0, @total=0.009999999999999787, @utime=0.009999999999999787>

# Two (purely column-based) queries
<Benchmark::Tms:0x00007fd2518c36d0 @cstime=0.0, @cutime=0.0, @label="", @real=2.309347999995225, @stime=0.0, @total=0.0, @utime=0.0>

【讨论】:

【参考方案3】:
Post.connection.execute \
  "UPDATE posts SET active = TRUE WHERE user_id IS NOT NULL"

正确的方法是从数据库中删除 active 字段并在 Post 类中实现 ruby​​ getter:

def active
  user.present?
end

【讨论】:

@ndn 不。无论如何,最好的方法是从数据库中删除 active 字段并实现 def active; user.present?; end 你不知道。 active 帖子可能意味着完全不同的东西,只是 OP 最初想用这些值填充它。 您不必使用纯 SQL。这不是 Rails 的方式。 ActiveRecord 也允许这样做 @user3309314 Rails 很烂,如果可能我从不使用 Rails 方式。 @ndn 我知道如果您需要使用其他字段的值填充任何字段,那么设计就会出现问题:)

以上是关于优化查询以获得更好的性能的主要内容,如果未能解决你的问题,请参考以下文章

优化存储过程以获得更好的性能[关闭]

如何优化 1Gb 大小 250k+ 行的 Mysql 表以获得更好的性能

如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行

嵌套 CASE 的 T-SQL 替代方案以获得更好的性能?

如何使用 SQLab Xpert Tuning 来调整 SQL 以获得更好的性能?

通过优化Gunicorn配置获得更好的性能