0

指定された位置の近くの場所を見つけるために、オタクディナーの例を修正しました。フラット テーブルから選択する場合のパフォーマンスは良好ですが、テーブルを分割したかったので、一般的な座標テーブル (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 秒かかります。

4

1 に答える 1

1

Robban の助けを借りて、その方法を見つけました」。この投稿を参照してください。

パラメーターなしのコンストラクターを使用するように関数を書き直したので、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.4 秒かかりますが、これはある程度許容範囲です。私の平均的なマシンが到着したときに、物事がより速くなることを願っています. 誰かがクエリを改善する方法、ストアド プロシージャを使用する方法、またはインデックスを設定する方法についてのヒントを教えてくれたら、とても感謝しています。

于 2011-02-11T08:40:45.943 に答える