生の 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 のアクティブ レコード クエリ生成のオーバーヘッドが排除され、特に大規模なデータセットの場合、大幅なパフォーマンスの向上につながる可能性があります。 records_array
は Ruby 配列と同様に扱うことができるため、アプリケーション ロジックにシームレスに統合できます。この手法は、タイムアウトになりやすい複雑なクエリを処理する場合に特に役立ちます。
以上がRaw SQL は複雑な Rails クエリのパフォーマンスをどのように向上させることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。