1

我正在使用实体框架来检索由属性和集合组成的复杂对象(这些集合也可以由集合组成)。数据本身很小,但结构很复杂。一个简单的例子(实际上有更多的属性和集合):

public class Parent
{
    public int ParentId {get; set;}
    public ICollection<Measurement1> MeasurementOnes {get; set;}
    public ICollection<Measurement2> MeasurementTwos {get; set;}
    public ICollection<Child> Children {get; set;}
    public string PropertyOne {get; set;}
    public string PropertyTwo {get; set;}...etc
}

public class Child
{
    public int ChildrenId {get; set;}
    public ICollection<Measurement3> MeasurementThrees {get; set;}
    public string PropertyThree {get; set;}
}

上面的例子非常简化,但给出了结构的概述。所有测量值每分钟更新一次(通过外部 API),并且属性也可以更改。

我需要从数据库中加载这个结构(我们使用的是 SQL Server)并将其传递给优化算法。必须每半小时为所有家长做一次。从数据库加载结构大约需要一秒钟,这意味着我只能在给定的时间间隔内优化大约 1800 个父母。

当然,我可以尝试优化查询,在数据库中添加一些索引等,并将从数据库中检索的时间从 1 秒降低到 0.7 秒。那么我最多可以优化2500个Parents左右,但要求是10000个(db访问时间必须小于0.18秒)。我不知道如果我不使用实体框架编写存储过程,性能会提高多少,但对我来说,对象结构似乎是真正的问题,因为为了检索所有数据,需要多次往返数据库。

由于 Parent 的数据在每个间隔之间发生了很大变化,我不知道缓存是否是要走的路。

有没有人对类似问题有任何经验或对我应该如何做以将数据库访问时间减少 10 倍的任何建议?

4

2 回答 2

3

我会尝试两件事:

  • 编写一个存储过程,为父母、孩子等返回多个结果集。编写代码来读取结果并实例化您的对象

  • 让存储的 proc 使用“for xml”在 xml 中的数据库端创建此结构使用 xml 反序列化器来实例化您的对象

于 2013-06-20T07:31:47.833 回答
3

创建索引。

您认为 1 秒可以减少到 0.7 的假设非常幼稚。索引可以将查询时间从分钟/秒减少到毫秒。读取几行数据需要几毫秒。索引此特定进程用于搜索数据的所有主键、外键和任何其他列 - 因为此进程一直在运行,因此优化 EF 生成和执行的每个查询是有意义的。SQL Profiler 在这里可以提供真正的帮助,您可以捕获 EF 发送的每个查询并使用 SSMS 检查查询计划。

这是 SQL Profiler 的链接,可帮助您入门

(还有其他可用的分析工具,但您应该已经拥有 SQL Profiler)

于 2013-06-20T09:40:42.180 回答