使用原始 SQL 优化复杂的 Rails 查询
部署 Rails 应用程序,尤其是在 Heroku 这样的平台上,有时会暴露出复杂数据库查询带来的性能瓶颈。 本文演示了如何使用原始 SQL 显着提高此类查询的效率。
在 Rails 中利用原始 SQL
Rails 提供了直接执行自定义 SQL 的机制。 这会绕过 ActiveRecord 查询构建器,通常会导致执行速度更快。 流程如下:
ActiveRecord::Base.connection.execute
对数据库运行查询。说明性示例
让我们检查一个涉及连接表和排序的场景:
<code class="language-ruby">@payments = PaymentDetail.joins(:project).order('payment_details.created_at desc') @payment_errors = PaymentError.joins(:project).order('payment_errors.created_at desc') @all_payments = (@payments + @payment_errors)</code>
此代码连接 PaymentDetail
和 PaymentError
表,按 created_at
时间戳对结果进行排序。 等效的原始 SQL 是:
<code class="language-sql">sql = "SELECT * FROM payment_details pd LEFT JOIN projects p ON pd.project_id = p.id UNION ALL SELECT * FROM payment_errors pe LEFT JOIN projects p ON pe.project_id = p.id ORDER BY created_at DESC"</code>
执行就很简单了:
<code class="language-ruby">records_array = ActiveRecord::Base.connection.execute(sql)</code>
性能提升
使用原始 SQL 消除了 Rails 的 Active Record 查询生成的开销,可能会带来显着的性能改进,尤其是对于大型数据集。 records_array
可以像任何 Ruby 数组一样对待,允许无缝集成到您的应用程序逻辑中。在处理容易超时的复杂查询时,这种技术特别有价值。
以上是原始 SQL 如何增强复杂 Rails 查询的性能?的详细内容。更多信息请关注PHP中文网其他相关文章!