2

私はここ 1.5 年間、Rails で働いています (真剣に取り組んでいるという意味です)。.Net のバックグラウンドとデータベース/OLAP 開発の経験から、Rails には多くの点が気に入っていますが、意味をなさない点はほとんどありません。そのような問題の1つについて説明が必要です。

私は教育機関の入学プロセスに取り組んできましたが、これはより大きなアプリケーションのほんの一部にすぎません。ここで、管理者のために、すべての申請済み/登録済みの学生 (1000 から 10,000 の範囲) のリストを表示し、それらを Excel ファイルとしてエクスポートする方法を提供する必要がありました。今のところ、CSV 形式でのエクスポートにのみ焦点を当てています。

私の質問は次のとおりです。

  1. Rails は、これほど多くのレコードを同時に表示することを意図していますか?

  2. Railsでレコードをページ分割する唯一の方法はwill_paginateですか? 私が理解していることから、DBからすべてのレコードを取得し、関連するレコードを選択的に表示します。.Net/PHP/JSP に戻って、ストアド プロシージャを作成し、そこから関連するレコードを選択的に返します。ストアド プロシージャを使用することは Rails の既知の問題であるため、他にどのようなオプションがありますか?

  3. このデータのエクスポートと同じ問題。サーバーでリクエストを受信し、クエリを実行し、レスポンスが返されるプロセスをベンチマークしました。ActiveRecord の作成には非常に時間がかかりました。それはなぜですか?レコードは 1000 件程度しかなく、ページにはユーザーの接続タイムアウトが表示されました。つまり、1000 レコードの作業中に接続がタイムアウトした場合、なぜ Rails を使用するのか、または Rails がそのようなアプリケーション向けではないことを意味します。私は以前に TB のデータを扱ったことがありますが、この問題は一度もありませんでした。

  4. ORM テクニックの核心を理解したことがありませんでした。たとえば、 tableusersがあり、他の複数の table に関連付けられていますが、レコードを表示するには、 tableusersとそれに関連付けられた tableからのデータのみが必要であり、関連付けadmissionsられたすべての table のオブジェクトを実際に作成します。関連付けを使用した場合にのみデータがフェッチされることはわかっていますが、事前にすべてのオブジェクトを作成するのでしょうか?

これらの質問が独立したものではなく、SF のガイドラインに従っていることを願っています。

ありがとうございました。

編集:何か助けて?1000 レコードについて、4 ~ 5 個の異なるテーブル (1000 ユーザー、2 ~ 3 個の 1 対 1 関連付け、および 2 ~ 3 個の 1 対多関連付け) を結合している場合、再確認して再度ベンチマークを行いました。 15000 以上のオブジェクトを作成しています。これは熱心な読み込み用です。遅延読み込みに関しては、1000 のユーザー クエリと 20 以上のクエリになります)。そのような問題やアプリケーションに対して他に考えられるオプションは何ですか? 私は知っています、私はちょっと質問をぶつけて、再びトップに来ます!

4

1 に答える 1

0

Rails は、TB 単位のデータを持つデータベースを処理できます。

Railsでレコードをページ分割する唯一の方法はwill_paginateですか?

他にも「カミナリ」のような逸品がたくさんあります。

データベースからすべてのレコードを取得します。

番号。そのようには機能しません。たとえば、次のクエリを使用します。Users.all.page(1).per(10)

User.all は db クエリを起動せず、プロキシ オブジェクトを返します。そして、proxy(ActiveRecord::Relation) で page(1) と per(10) を呼び出します。プロキシ オブジェクトからデータにアクセスしようとすると、db クエリが実行されます。アクティブ レコードは、渡されたすべての条件とパラメーターを蓄積し、必要に応じて SQL クエリを実行します。

Rails コンソールに移動し、次のように入力しますu= User.all; "f";(2 番目のステートメント: "f" は、Rails コンソールがプロキシで to_s を呼び出して結果を表示しないようにするためのものです)。

クエリは発生しません。試しu[0]てみると、クエリが起動します。

ActiveRecord の作成に非常に時間がかかっていた

1000 レコードにそれほど時間はかかりません。

  • データベースから起動された SQL クエリの数を確認します。n+1 の問題の兆候を探し、熱心な読み込みで修正します。
  • cpu またはメモリを集中的に使用する操作については、csv 形式へのレコードのシリアル化を確認してください。
  • プロファイラーを使用して、最も多くの時間を消費している関数を追跡します。
于 2013-04-15T06:08:46.267 に答える