2009-05-13 21 views
0

私のシステムでは、多くのコレクションを持つ集計に対して集中計算を行います。計算の前にすべてのコレクションをロードする必要があります。したがって、ルート上のコレクションに結合する複数の条件を使用します。NHibernateクエリを最適化する

基準iを以下に示します。私のローカルセットアップでは約500msの時間がかかりますが、それはユーザーの待ち時間です。誰も私がこれをどのように最適化できるかについてのアイデアはありますか?このクエリをより速くするための助けがあれば幸いです!

(私は少しプライバシー保護のためのコレクションの名前を変更しました:))

IMultiCriteria criteria = session.CreateMultiCriteria() 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ACollection", JoinType.LeftOuterJoin) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("BCollection", JoinType.LeftOuterJoin) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("CCollection", JoinType.LeftOuterJoin) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ECollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("FCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("GCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("HCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("JCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("KCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("LCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("MCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("NCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("OCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("PCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("QCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("RCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("SCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("TCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("UCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("VCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("WCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("XCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("YCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ZCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("AACollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ABCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ACCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ADCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("AECollection", JoinType.LeftOuterJoin)); 
+0

すごい...印象は –

+0

笑...はい、私は確かに、私は別の選択肢があればいいのに! :) – asgerhallas

答えて

1

私はお勧めでき非常に最初の事はあなたのSQLプロファイラを起動し、SQLの正確なコピーを取得することです私はそれを取ってSql Tunerに入れます。これは、新しいインデックスの作成とテーブルの一部またはすべての統計の追加/更新をお勧めします。

この時点で、パフォーマンステストを実行してから、HQLのパフォーマンスチューニングを試みます。

2

私が最後に気付いたのは、この厳密なシナリオでは、MongoDBやオブジェクトデータベースなどのドキュメント指向のデータベースを使用する方がはるかに意味があるかもしれないということです。

このようにして、1つの集合体全体をロードして結合を忘れることができます。

上記のようなシナリオを実行するユーザーにとっては、ドキュメント指向のアプローチの使用を検討してください。

私の最初のテストでは、約束を示し:)のMongoDBへ

一つの導入はここで見つけることができます:http://mookid.dk/oncode/archives/1057