将实体框架中的DbGeography类型编入索引可以提高查询性能吗?

时间:2015-07-24 04:56:17

标签: c# asp.net-mvc entity-framework indexing

我的问题与this SO thread相同,但我想知道是否确实需要在'DbGeography LocationPoints'上设置索引?我认为简单的答案当然是肯定的,但也许空间类型有一些东西可以做一些特别的事我不知道要保持快速搜索...

如果我要通过大量空间数据查询,我会在没有索引的情况下获得性能提升吗?在实体框架内部还是外部,我还能做些什么来提高查询性能?是否可以首先在EF代码之外的DbGeography类型上创建索引?如果必须,我将首先删除代码并返回ADO.net。我刚刚读到MongoDb有一个可用于快速搜索位置数据的空间索引。我应该转移到Azure上的MongoDb吗?

我在MSDN spacial indexescreate spacial index中看到了一些链接,但不知道它们是否会适用于我。

以防万一我需要在这里展示这个帖子的代码。这是我的查询以及用于搜索空间数据的对象。我只在本地主机上测试过,但运行几百个查询似乎很慢。

var yogaSpaces = (from u in context.YogaSpaces
                         orderby u.Address.LocationPoints.Distance(myLocation)
                         where ((u.Address.LocationPoints.Distance(myLocation) <= 8047)
                         && (u.Events.Any(e => e.DateTimeScheduled >= classDate)))
                         select u).ToPagedList(page, 10);

public class YogaSpaceAddress
{
    //omitted code here

    public DbGeography LocationPoints { get; set; }
    // omitted code here
}

public class YogaSpaceEvent
{
    public int YogaSpaceEventId { get; set; }
    //public string Title { get; set; }
    [Index]
    //research more about clustered indexes to see if it's really needed here
    //[Index(IsClustered = true, IsUnique = false)] 
    public DateTime DateTimeScheduled { get; set; }
    //omitted code here
}


public class YogaSpace
{
    //omitted code here

    public virtual YogaSpaceAddress Address { get; set; }

    //omitted code here

    public virtual ICollection<YogaSpaceEvent> Events { get; set; }

    //omitted code here
}

1 个答案:

答案 0 :(得分:0)

我的建议是让LINQ执行SQL查询,然后在SQL管理工作室中使用它来分析它并获得执行计划,它会给你如何改进它的建议。

如果这些建议不起作用,那么转到MongoDB可能会有所帮助。需要考虑的是实体框架可能是问题,因为它可能会将如此多的对象加载到内存中。