Techioz Blog

マップ、収集、選択、摘み取るのはどれが速いですか?

概要

アクティブなレコードから特定のフィールドを取得するためにさまざまな方法を使用してきましたが、どの方法がより高速で好んで使用されますか?また、それらは互いにどう違うのでしょうか?

User.all.collect(&:name)
User.all.pluck(:name)
User.all.select(:name)
User.all.map(&:name)

事前にご協力いただきありがとうございます。

解決策

これらのメソッドのいずれかを使用するには、さまざまなユースケースが必要です。

select と pluck は両方とも、指定された列の SQL の SELECT (SELECT “users”.”name” FROM “users”) を行います。したがって、まだフェッチされていないユーザーがいない場合、これらのメソッドはマップ/収集よりもパフォーマンスが高くなります。

選択と摘み取りの違い:

collect/map メソッドは実際にはエイリアスであるため、それらの間に違いはありません。しかし、モデルを反復処理するには、(特定の列ではなく) モデル全体をフェッチし、SELECT “users”.* FROM “users” リクエストを作成し、リレーションを配列に変換してマッピングします。

これは、リレーションがすでにフェッチされている場合に便利です。そうであれば、追加のリクエストは行われず、最終的に pluck または select を使用するよりもパフォーマンスが向上する可能性があります。ただし、繰り返しになりますが、特定の使用例に合わせて測定する必要があります。