マップ、収集、選択、摘み取るのはどれが速いですか?
概要
アクティブなレコードから特定のフィールドを取得するためにさまざまな方法を使用してきましたが、どの方法がより高速で好んで使用されますか?また、それらは互いにどう違うのでしょうか?
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 を使用するよりもパフォーマンスが向上する可能性があります。ただし、繰り返しになりますが、特定の使用例に合わせて測定する必要があります。