【问题标题】:Entity Framework RPC vs batch performance实体框架 RPC 与批处理性能
【发布时间】:2017-01-09 04:42:20
【问题描述】:

我在一台机器上有一个带有应用程序池 (IIS) 的 .net 应用程序,在另一台机器上有一个 SQL 服务器。应用程序使用实体框架来处理数据库。我有两种选择来解决我的任务(从数据库获取数据)。例如,我在应用程序中有实体 1 的列表,我需要从数据库中获取实体 2 的列表(实体 2 通过外键连接到实体 1)。 我有两种选择。

第一个是向数据库发出一个批处理请求:

public List<Entity2> GetEntities(List<long> entity1IDs)
{
    db.Entity2.Where(e2 => entity1IDs.Contains(e2.Entity1ID)).ToList();
}
...
var entities2 = GetEntities(entities1.Select(e => e.Entity1ID).ToList());
foreach (var entity2 in entities2)
{
    ...
}

第二个是向DB发出n个rpc请求:

foreach (var entity1 in entities1)
{
    var entity2 = entity1.entity2;
    ...
}

我很确定第一个选项必须具有更好的性能,因为只有一个对 DB 的请求。但它如何影响应用程序池?是的,这只是一个请求,但它是一个单位时间内内存中的大量动态数据。如果我们在数据库中有数百万条记录,那么我们对应用程序池中内存使用率高的数据库和处理大量数据(选项 1)的 cpu 使用率的数据库有一个大请求,而对应用程序内存使用率低的数据库的数百万个请求池和 CPU 使用率。

反正我倾向于第一种,但想了解更多的论点,也许还有一些实践结果和分析。

是否还有任何分析工具可以跟踪应用程序池使用 SQL 的 CPU 使用量以及使用应用程序池中的数据操作的 CPU 使用量以进行比较?

【问题讨论】:

  • 关键字是“基准测试”和“分析”,必须这样做。这个问题没有灵丹妙药的解决方案,它取决于太多的变量。
  • @CodeCaster 是的,这就是为什么我询问应用程序池的分析工具以进行实践测试并为我的情况找到最佳解决方案。

标签: sql .net entity-framework iis application-pool


【解决方案1】:

您面临的问题取决于您的服务器资源以及您认为更昂贵的资源。通常内存很便宜,但网络更贵,而且性能更成问题。

您正在做的是在实际遇到相关问题之前尝试优化您的解决方案。我会选择第一个,因为通常网络更成问题,并且每次创建连接都会损害性能。如果您确实因为查询量大而遇到问题(这在大多数系统中不太可能发生),那么您应该考虑改进代码以满足您的特定需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2011-04-13
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多