【问题标题】:How optimize a lot of different requests to DB?如何优化对数据库的许多不同请求?
【发布时间】:2019-03-05 17:29:36
【问题描述】:

我正在使用带有 EF 6 和 LINQ 的 SQL Server 数据库。

例如,我在一个页面上有 10 个下拉列表。我需要从数据库中获取这些下拉列表。

我需要同时做 10 个不同的请求,这需要很多时间。在我的情况下,每个请求大约需要 0,05ec。 10 个请求 * 0,05 = 0,5 秒。很长。

如何以其他方式提出这些请求以提高性能?

请求示例

var marriageStatuses = await db.MarriageStatus
                               .AsNoTracking()
                               .Select(x => new
                                            {
                                                Id = x.Id,
                                                Description = x.Description
                                            })
                               .ToListAsync();

表格示例:

【问题讨论】:

  • 创建一个任务列表并同时运行它们,它们将在不同的线程上运行
  • 如果它们不相互依赖,您可以并行异步调用它们。只需捕获任务并使用Task.WhenAll 等待它们全部完成。此外,如果数据库数据不经常更改,您可能需要添加缓存。
  • 任务 task1 = context.Languages.ToListAsync();任务 task2 = context.MarriageStatus.ToListAsync();等待 Task.WhenAll(task1, task2);我尝试了这个,但出现异常 - 在前一个异步操作完成之前,在此上下文上开始了第二个操作。使用 'await' 确保在此上下文中调用另一个方法之前所有异步操作都已完成。不保证任何实例成员都是线程安全的。

标签: c# sql-server asp.net-mvc entity-framework asp.net-web-api


【解决方案1】:

有一些通用的直接技术可以处理这样的问题:

  1. 避免任何 n+1 个查询,将它们组合成一个查询以供整个集合使用
  2. 在提取冗余数据的情况下组合任何其他查询
  3. 使用后续服务器请求延迟加载组件,以便首先加载页面

如果您有更多详细信息(例如要查询的表和列),我也许可以更具体地回答。

【讨论】:

  • 我在示例中添加了两个简单的表格。
  • 考虑到表格看起来有多短,我不明白为什么会出现性能问题。 0.05ms * 10 = 0.5ms = 0.0005 seconds?
  • 打开与数据库的连接 - 我认为这就是为什么无论有 10 条记录还是 100 条记录都需要大量时间的原因。就我而言,大约需要 50 毫秒!每个请求。
  • 如果您的问题是数据库延迟,您只能通过关注它来解决它。通过在本地缓存数据或寻址网络连接。
  • 幸运的是,使用 EF6,您仍然可以通过 db 上下文访问 DbReader 并在单个查询中检索多个结果集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多