現在のRails3アプリでは、スキーマへの関連付けを増やすとパフォーマンスが低下します。
このパフォーマンスはページの読み込みとは関係ありませんが、resqueを使用して実行するバックグラウンドタスクと関係があります。タスクは外部データソースを解析してデータベースにデータを入力します。これは、カスタムヘルパーメソッド(かなり長いメソッド)を介して行われます。
大量のデータを解析しているため、タスクの実行速度はそれほど速くないと思いますが、最近、いくつかの関連付けを追加した後、テストメソッドの実行時間が2分から約5分に増加しました。私はVMで実行しているので、おそらくそれが一般的に非常に遅い理由です。
ruby-profを使用すると、追加の計算の大部分は、追加した関連付けを処理するメソッドに費やされているようです。
ActiveRecord::Associations::CollectionAssociation#* (where * is any number of methods)
アソシエーションを追加すると、アソシエーションテーブルにインデックスが含まれます。ただし、これ以外に、これらの関連付けを追加することで見られるパフォーマンスへの影響を軽減するために何ができるかはわかりません。
だから私の質問は:
1)関連付けを追加すると、Railsアプリのパフォーマンスが大幅に低下する可能性はありますか?2)パフォーマンスの高い多くの関連付けを持つRailsアプリを使用するためのベストプラクティスは何ですか?
編集:要求に応じていくつかの追加情報
- データベース:Postgres
- 私が追加したアソシエーションは両方ともHABTMでした
- 時間がかかるのは、これらの関連付けの作成です。人口のプロセス中に、数千とまではいかなくても数百の関連付けを作成しています。一括挿入の場合、私はactiverecord-importを使用しており、これにより処理が大幅に高速化されますが、関連付けに相当するものはわかりません。
私は次のことをしていました(簡単にするために変数を変更しました):
// flavors_array is an array of all the Flavor objects I want to associate with my ice_cream ice_cream.flavors = flavors_array
このようにしたのは、この「ice_cream」インスタンスには、「=」を使用して削除する既存の関連付けがないことを確実に知っているためです。
- ただし、この方法はまだ非常に遅いです
- 重要:上記をSQLステートメントに置き換えて、関連付けを(IDを介して)関連付けテーブルに直接一括挿入すると、パフォーマンスが大幅に向上します。操作はほとんど時間がかかりません。