0

我修改了书呆子晚餐示例以查找指定位置附近的位置。从平面表中选择时性能很好,但我想拆分表,所以我有一个通用坐标表(SDB_Geography),并且还加入了一个包含特定数据的表,我称之为实体类型(HB_Entity)。

我制作了一个名为 HbEntityModel 的新模型,它存储实体、hb 和地理“子模型”。现在的问题是这个查询需要大约 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_Entity 1:0/1 SDB_Geography

SDB_Entity 1:0/1 HB_Entity

搜索产生大约 70 个 HbEntityModel。

如果从单个表中选择相同的查询需要 0.3 秒,使用 IQueryable 而不是 IEnumerable。

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 回答