指定された位置の近くの場所を見つけるために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秒かかります。
最初の '.AsEnumerable()'はなぜですか?あなたはオブジェクト空間ですべてをやっています。遅いのは驚きではありません。メモリに4つのテーブルをダウンロードしたばかりです。 –
最初のAsEnumerableがない場合、「パラメータなしのコンストラクタと初期化子のみがLINQ to Entitiesでサポートされています」 – Malako
はい、ただし、入力ではなく、結合の結果にのみ必要です。 –