今回はRails 7から導入された新機能 load_asyncについて解説します!
私のブログにも同じ内容を記載しておりますので、こちらも是非ご参照ください
load_asyncとは
Rails 7から追加された、「非同期的にクエリ実行するためのメソッド」です。
並列にクエリが実行されるため、うまく使うと これまで時間がかかっていた処理をかなり短縮できる「可能性」 があります。
load_asyncの使い方
以下のような場面を想像してみましょう。
mypageを取得するメソッドの中で、「お客様のプロフィール」「お客様の購入履歴」「お客様の獲得ポイント」の3つを取得しています。
def mypage
@profile = Profile.find_by(user_id: params[:user_id])
@orders = Order.where(user_id: params[:user_id])
@points = Point.where(user_id: params[:user_id])
end
ここで、通常であればこの処理は上から順に「プロフィールの取得」=>「購入履歴の取得」=>「獲得ポイントの取得」の順番に進んでいきます。
では、load_asyncを使ってみます。使い方は以下のように各行の末尾にload_asyncをつけるだけです。
def mypage
@profile = Profile.find_by(user_id: params[:user_id]).load_async
@orders = Order.where(user_id: params[:user_id]).load_async
@points = Point.where(user_id: params[:user_id]).load_async
end
ここで、処理は「プロフィールの取得」「購入履歴の取得」「獲得ポイントの取得」が 並列に走ります。
使い方によってはかなりの短縮ができそうですね!
load_asyncの設定
デフォルトでの並列数は 4つ です。これ以上増やす場合は、config.active_record.async_query_executor
の設定が必要です
config.active_record.async_query_executor = 5 # クエリを5つ並列に
load_asyncの注意点
一見「全部これでいいのでは」と思えるほど便利なメソッドですが、意外な落とし穴もあります。
トランザクションの挙動に注意
トランザクション内ではload_asyncを使っても直列的な動きになることが考えられます。
データベースのメモリ使用量に注意
並列数をあまりに増やしすぎると、データベースのメモリを過度に使い、逆にパフォーマンスが低下する恐れもあります。
利用する際は、データベースのメモリ使用量に注意し、適度に監視を行いましょう。
まとめ
- load_async を末尾につけると, クエリの並列化が行える
- 並列にできるクエリ数はデフォルトでは4つ
- データベースのメモリや, トランザクションの挙動に注意
無闇に使わず、ボトルネックに適切に効かせて武器にしましょう🔥