指定された位置の近くの場所を見つけるために、オタクディナーの例を修正しました。フラット テーブルから選択する場合のパフォーマンスは良好ですが、テーブルを分割したかったので、一般的な座標テーブル (SDB_Geography) を用意し、エンティティ タイプ (HB_Entity) と呼ばれるものの特定のデータを含むテーブルに結合しました。
エンティティ、hb、地理の「サブモデル」を格納する HbEntityModel という新しいモデルを作成しました。問題は、このクエリの実行に約 5 秒かかることです。これを行うことでパフォーマンスがわずかに低下すると考えましたが、5秒はばかげています。現在のテーブル設定でパフォーマンスを改善する方法についてのアイデアはありますか?それとも巨大なフラット テーブルに戻る必要がありますか?
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();
}
アップデート
すべてのテーブルには、約 14000 のレコードが含まれています。
SDB_エンティティ 1:0/1 SDB_地理
SDB_エンティティ 1:0/1 HB_エンティティ
検索により、約 70 の HbEntityModels が生成されます。
単一のテーブルから選択する場合、IEnumerable の代わりに IQueryable を使用すると、同じクエリに 0.3 秒かかります。