1

Ruby on Rails は初めてです。現在、Rails アプリケーションのパフォーマンスの問題に取り組んでいます。コードのボトルネックを見つけるために New Relic rpm を使用しています。そうこうしているうちに、わからないことを発見。問題は、ここの Rails アプリケーションで、モデル B が次のように A の主キーと C の主キーの 2 つのプロパティを持つ、2 つのモデル A、B、および C を使用したことです。

class B
  include DataMapper::Resource
  belongs_to :A, :key=>true
  belongs_to :C, :key=>true
end

Aのモデルは次のとおりです。

 class A
   include DataMapper::Resource
   property :prop1
   ...
   has n, :bs
   has n, :cs, :through => :bs
 end

次のステートメント a.find(:c.id=>10) を発行すると、内部的に次の SQL クエリが実行されます。

 select a.prop1, a.prop2,... from a INNER JOIN b on a.id = b.a_id INNER JOIN c on b.c_id = c.id where (c.id=10) GROUP BY a.prop1, a.prop2,....[here in group by all the properties that has been mentioned in select appears, I don't know why]

そして、このステートメントは、Web トランザクション中に時間がかかりすぎます。興味深いことに、端末の mysql プロンプトで同じ自動生成クエリを実行すると、時間が非常に短くなります。group by 句で非常に多くのフィールドに言及しているためだと思います。クエリがどのように形成されているのか理解できません。誰かがこれを理解し、これを最適化するのを手伝ってくれたら、本当に感謝しています。ありがとうございました。

4

1 に答える 1