0

たとえば、Ruby onRailsでActorモデルオブジェクトがTomHanksであり、「has_many」ファンが20,000 Fanオブジェクトである場合、

actor.fans

20,000要素の配列を提供します。おそらく、要素には値が事前に入力されていませんか?そうしないと、DBから各Actorオブジェクトを取得するのに非常に時間がかかる可能性があります。

それで、それは「知る必要がある」ベースですか?

では、actor.fans [500]にアクセスするとデータがプルされ、actor.fans [0]にアクセスするとデータがプルされますか?各レコードからレコードにジャンプする場合、シーケンシャル読み取りを実行してパフォーマンスを最適化することはできません。たとえば、これらのレコードが近くのセクター/プラッターレイヤーにある可能性があるため、ハードディスク上でより高速になります。プログラムが2つのランダムな要素に触れると、それらの2つのレコードを読み取るだけの方が高速になりますが、すべての要素にランダムな順序で触れると、すべてのレコードを順番に読み取ってからランダムを処理する方が速くなる可能性があります。要素。しかし、RoRは、私がいくつかのランダムな要素だけを実行しているのか、すべての要素をランダムに実行しているのかをどのように知るのでしょうか?

4

2 に答える 2

1

2つしか使用しないのに、なぜ50000レコードをフェッチしたいのですか?次に、これら2つだけをDBからフェッチします。ファンを一覧表示する場合は、おそらくページ付けを使用します。つまり、クエリでlimitとoffsetを使用するか、will_paginateのようなページ付けの宝石を使用します。

なぜあなたがしようとしているように行かなければならないのか、論理的な説明はわかりません。私たちがあなたを助けることができるように、実際の状況を説明してください。

ただし、DBから多くの関連オブジェクトをロードする際に知っておく必要があると思われるものがあります-:includelikeを使用してください

Actor.all(:include => :fans)

これにより、すべてのファンが熱心に読み込まれるため、N + 1ではなく2つのクエリのみが発生します。ここで、Nはアクターの数です。

于 2010-05-23T14:35:58.980 に答える
1

開発モードでサーバーによって吐き出されるSQLを見ると、ロードされているファンレコードの数がわかります。この場合actor.fans、実際にそれらすべてがロードされますが、これはおそらくあなたが望むものではありません。

いくつかのオプションがあります。

  • Tadasによって提案されたページ付けを使用します。
  • 興味のあるものだけを取り込むファンテーブルとの別の関連付けを設定します。これは、has_manyステートメントの条件を使用して行うことができます。
    has_many :fans, :conditions => "country of residence = 'UK'"
  • :finder_sqlオプションで返される行を絞り込むために完全なSQLを指定する
  • :limit返される行数を制限するオプションを指定します。

すべてはあなたが何をしたいかに依存します。

于 2010-05-23T15:51:22.160 に答える