首页 > 解决方案 > 28,000 行在生产环境中返回非常缓慢

问题描述

我有一个非常简单的 get ,它从字面上抓取整个 DB 集并通过网络返回它。目前有问题的集合大约有 28k 行。

在本地测试时,对数据库的调用在不到一秒的时间内完成,但大摇大摆的调用大约需要一分钟。在我们的生产环境中完成调用大约需要 1-2 分钟(我们没有精确的 db 调用的计时代码,但我们在前端计时需要多长时间,也是 1-2分钟)。

数据调用和它到达前端之间的东西需要很长时间,我不确定如何解决它。

代码字面意思是:

[HttpGet]
public IActionResult GetAllCustomers()
{
    return Ok(_context.Customers);
}

我还能做些什么来调试这个?

我们的工作解决方案将显着限制数据集,改为返回 < 1000 条记录,但业务偏好是拥有所有内容并让前端表对其进行排序和过滤。

灵机一动,我从模型中删除了所有相关的对象,并将其剥离到表格中的 10 列左右,但仍然花费了很长时间。

标签: c#asp.net-coreef-core-2.1

解决方案


您的问题与 ASP.NET 或微服务架构无关...

如果您在数据库表中有 28,000 条记录,并通过 HTTP 请求所有记录,那将会很慢。

请求是快速 localhost 的部分原因是所有 28,000 条记录都是在 localhost 发送的,而不是像生产中那样“通过网络”发送。在生产中,所有 28,000 条记录都必须通过 Internet 传输。请求可能是快速 localhost 的另一个原因是您的数据库也在运行 localhost,因此再次,数据不必“通过网络”传输。在生产环境中,即使数据库是内部的,数据可能仍有一段距离从数据库传输到 API,也是“通过网络”传输的,如果您的数据库也在运行 localhost,则不会发生这种情况。

解决方案是在您的 API 和前端实现分页: 在此处输入图像描述

您提到了要求:“但业务偏好是拥有所有内容并让前端表格对其进行排序和过滤。”

排序和过滤也与分页一起完成: 在此处输入图像描述

一开始您可能没有意识到,但这是 Web 应用程序中最常见的问题之一,并且总是通过分页或垂直滚动​​延迟加载网页和 Web 控件来解决。下载所有数据以便前端可以进行分页、排序和过滤不是解决问题的正确方法。


推荐阅读