Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C、 缩短数据库访问时间_C#_Sql Server_Performance_Entity Framework - Fatal编程技术网

C# C、 缩短数据库访问时间

C# C、 缩短数据库访问时间,c#,sql-server,performance,entity-framework,C#,Sql Server,Performance,Entity Framework,我使用实体框架来检索一个复杂的对象,它由属性和集合组成,这些集合也可以由集合组成。数据本身非常小,但结构非常复杂。一个简单的例子是,实际上有更多的属性和集合: public class Parent { public int ParentId {get; set;} public ICollection<Measurement1> MeasurementOnes {get; set;} public ICollection<Measurement2>

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

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秒。我不知道如果我不使用实体框架编写的存储过程,性能会提高多少,但是对我来说,对象结构似乎是真正的问题,因为为了检索所有数据,需要多次往返数据库

由于父级的数据在每个时间间隔之间都发生了很大的变化,我不知道是否应该使用缓存


有没有人有过类似问题的经验,或者对我应该如何将数据库访问时间减少10倍有什么建议?

我会尝试两件事:

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

让存储过程使用“for xml”在xml中的db端创建此结构,并使用xml反序列化器实例化对象


我想尝试两件事:

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

让存储过程使用“for xml”在xml中的db端创建此结构,并使用xml反序列化器实例化对象

创建索引

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

让你开始

还有其他分析工具可用,但您应该已经有了SQL Profiler创建索引

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

让你开始


还有其他分析工具可用,但您应该已经有了SQL Profiler

适当的索引和数据仓库在这半个小时内是否一切都发生了变化,还是只有部分数据发生了变化?对于选择使用EF来满足如此严格的性能要求,我有点困惑。您是否运行了跟踪来确定1秒延迟是否在数据库查询,或者使用秒表测量代码中的EF实体框架?我将首先创建一个不使用EF的小测试项目,并使用数据读取器执行两个SQL,一个用于父SQL,一个用于子SQL,将所有内容读入内存,然后计时。我真的很难相信,如果你没有几十亿个孩子的话,阅读一万个家长+孩子总共需要30分钟。记忆是个问题吗?你能同时将所有数据加载到内存中吗?适当的索引和数据仓库在这半个小时内一切都改变了吗?还是只改变了部分数据?我对选择使用EF有点困惑,因为它的性能要求非常严格。你有没有运行跟踪来确定数据库查询中是否存在1秒延迟,或者使用秒表来测量代码中的EF实体框架?我将首先创建一个不使用EF的小测试项目,并使用数据读取器执行两个SQL,一个用于父项,一个用于子项,将所有内容读入内存,以及timi
我不明白。我真的很难相信,如果你没有几十亿个孩子的话,阅读一万个家长+孩子总共需要30分钟。记忆是个问题吗?您能同时将所有数据加载到内存中吗?UPPOUTED是因为添加正确索引的性能改进确实是巨大的。UPPOUTED是因为添加正确索引的性能改进确实是巨大的。