2011-02-10 7 views
0

指定された位置の近くの場所を見つけるためにnerd dinnerの例を修正しました。フラットテーブルから選択するとパフォーマンスは良いですが、汎用テーブル(SDB_Geography)があり、エンティティタイプ(HB_Entity)と呼ばれる特定のデータを含むテーブルにも参加するように、テーブルを分割したいと考えていました。NerdディナーでEntity Framework 4が遅いFindByLocationの変更

エンティティ、hb、地理の "サブモデル"を格納するHbEntityModelという新しいモデルを作成しました。今問題は、このクエリが実行に約5秒かかることです。私はこれを行うことでパフォーマンスが少し低下すると思ったが、5秒はばかげている。 currrentテーブルの設定でパフォーマンスを向上させる方法に関するアイディアや、巨大なフラットテーブルに戻る必要がありますか?

public IEnumerable<HbEntityModel> FindByLocation(float latitude, float longitude) 
{ 
    return (from entity in db.SDB_Entity.AsEnumerable() 
       join nearest in NearestEntities(latitude, longitude, 2) 
       on entity.EntityId equals nearest.EntityId 
       join hb in db.HB_Entity 
       on entity.EntityId equals hb.EntityId 
       join geo in db.SDB_Geography 
       on entity.GeographyId equals geo.GeographyId 
       select new HbEntityModel(entity, hb, geo)).AsEnumerable(); 
} 

UPDATE

すべてのテーブルには、周りに14000レコードが含まれます。

SDB_Entity 1:0/1 SDB_Geography

SDB_Entity 1:0/1 HB_Entity 70 HbEntityModels周り

検索利回り。

単一のテーブルから選択する場合、IEnumerableの代わりにIQueryableを使用して同じクエリに0.3秒かかります。

+2

最初の '.AsEnumerable()'はなぜですか?あなたはオブジェクト空間ですべてをやっています。遅いのは驚きではありません。メモリに4つのテーブルをダウンロードしたばかりです。 –

+0

最初のAsEnumerableがない場合、「パラメータなしのコンストラクタと初期化子のみがLINQ to Entitiesでサポートされています」 – Malako

+0

はい、ただし、入力ではなく、結合の結果にのみ必要です。 –

答えて

1

私は「Robbanからいくつかの助けを借りてそれを行う方法を見つけた。this post.

を参照してください、私はパラメータなしのコンストラクタを使用する関数を書き直し、その後のIQueryableを使用することができます。

 public IQueryable<HbEntityModel> FindByLocation(float latitude, float longitude) 
    { 
     return (from entity in db.SDB_Entity 
        join nearest in NearestEntities(latitude, longitude, 2) 
        on entity.EntityId equals nearest.EntityId 
        join hb in db.HB_Entity 
        on entity.EntityId equals hb.EntityId 
        join geo in db.SDB_Geography 
        on entity.GeographyId equals geo.GeographyId 
        select new HbEntityModel() { Shared=entity, Specific=hb, Geography=geo }).AsQueryable(); 
    } 

クエリが今取ります私の平均マシンが到着したときにはもっと速くなることを望んでいます。もし誰かがクエリの改善方法やストアドプロシージャを使う方法やインデックスを設定したら、私は感謝以上のことができます。

+0

ストアドプロシージャはまったく必要ないはずですが、実行されたクエリを見るためにプロファイリングすることをお勧めします。実行計画もチェックアウトしてください。 – Phill

+0

アドバイスをいただきありがとうございます。私は次の週の終わりまでに物事を稼働させる必要があるので、後でそれを調べます。これはもはやショーストッパーではありません。 – Malako

関連する問題