我正在使用实体框架来检索由属性和集合组成的复杂对象(这些集合也可以包含集合)。数据本身很小但结构非常复杂。一个简单的例子(实际上有更多的属性和集合):
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个父项,但要求是10000(db访问时间必须小于0.18秒)。如果我不使用Entity框架编写存储过程,我不知道性能会增加多少,但对我来说,似乎对象结构是真正的问题,因为为了检索所有数据,需要多次往返数据库。
由于父节点的数据在每个间隔之间发生了很大的变化,我不知道缓存是否可行。
是否有任何人有类似问题的经验或有关如何将数据库访问时间减少10倍的任何建议?
答案 0 :(得分:3)
我会尝试两件事:
编写一个存储过程,为父项,子项等返回多个结果集。编写代码以读取结果并实例化对象
让存储的proc使用'for xml'在xml中使用xml反序列化器在db端创建这个结构来实例化你的对象
答案 1 :(得分:3)
创建索引。
你假设1秒可以减少到0.7是非常幼稚的。索引可以将查询时间从分钟/秒减少到毫秒。读取相当于几行数据的内容应该花费几毫秒。索引此特定进程用于搜索数据的所有主键,外键和任何其他列 - 因为此进程一直在运行,因此优化EF生成和执行的每个查询。 SQL Profiler在这里可以提供帮助,您可以捕获EF发送的每个查询,并使用SSMS检查查询计划。
Here's a link for SQL Profiler让你入门
(还有其他的分析工具,但你应该已经拥有SQL Profiler)