0

少しばかげているように聞こえるかもしれませんが、私は DB の専門家ではありません。

たとえば、UserモデルとCommentモデルがあり、各コメントがユーザーに属している場合、すべてのコメントとそのユーザーを取得するには 2 つの方法があります。

# 1.
@comments = Comment.all(:include => :user)

# 2. 
@comments = Comment.all()
@users = []
@comments.each do |comment| # Or we do the same loop in embedded code in the view
  @users << User.find(comment.user)
end

私の質問は、どちらの方法もすべてのコメントとそのユーザー データを取得するため (つまり、ハード ドライブとインターネットを介して同じ量の情報を読み取り、転送することを意味します)、なぜ 2 番目の方法が悪い習慣と見なされるのでしょうか?

4

2 に答える 2

4

理由を説明させてください。

Message.count
13228

Benchmark.measure { Message.all.each(&:user) }
16s

Benchmark.measure { Message.all(include: :user).each(&:user) }
2s

より現実的なフェッチである 100 行の場合:

Benchmark.measure { Message.limit(100).each(&:user) }
0.12s

Benchmark.measure { Message.includes(:user).limit(100).each(&:user) }
0.01s

ご覧のとおり、約 10 倍高速で、データベースへの負荷が軽減されています。

于 2013-10-29T18:18:46.107 に答える
2

Userレコードに関連付けられたレコードを取得するために DB に何度もアクセスするとComment、アプリケーションのパフォーマンスに影響します。

コメントの数が多すぎて、関連するすべてのユーザーを取得するためにループしている場合、これはさらに遅くなります。

Comment.all(:include => :user一方、クエリが 2 つしかない場合は、常に起動されます。1 つはコメントを取得するためのもので、もう 1 つは関連するすべてのユーザーを取得するためのものです。

于 2013-10-29T17:56:27.350 に答える