28 000 строк возвращаются очень медленно в производственной среде - PullRequest
0 голосов
/ 31 октября 2018

У меня есть очень простое получение, которое буквально захватывает весь набор БД и возвращает его по проводам. В данный момент речь идет о 28 тысячах строк.

При локальном тестировании вызовы в базу данных завершаются менее чем за секунду, но вызов swagger занимает около минуты. В нашей производственной среде для завершения вызова требуется около 1-2 минут (у нас нет точного кода для точных вызовов в БД, но мы рассчитываем во внешнем интерфейсе, сколько времени это занимает, и это также 1-2 минут).

Что-то между вызовом данных и его поступлением на внешний интерфейс занимает много времени, и я точно не знаю, как его решить.

Код буквально:

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

Что еще я могу сделать, чтобы отладить это?

Наше рабочее решение состоит в том, чтобы значительно ограничить набор данных, возвращая вместо этого <1000 записей, но бизнес-предпочтение состоит в том, чтобы иметь все и позволить внешней таблице сортировать и фильтровать ее. </p>

В жаворонке я удалил все связанные объекты из модели и разделил их примерно на 10 или около того столбцов в таблице, и это все еще занимало очень много времени.

1 Ответ

0 голосов
/ 01 ноября 2018

Ваша проблема не имеет ничего общего с ASP.NET или микросервисной архитектурой ...

Если у вас есть 28 000 записей в таблице базы данных и вы запрашиваете все записи по HTTP, это будет медленно.

Одной из причин быстрого запроса localhost является то, что все 28 000 записей отправляются localhost, а не «по проводам», как в случае с производством. В производстве все 28 000 записей должны путешествовать через Интернет. Другая причина, по которой запрос может быть быстрым localhost, заключается в том, что в вашей базе данных также работает localhost, поэтому опять же данные не должны перемещаться «по проводам». В производственной среде, даже если база данных является внутренней, данные могут все еще иметь некоторое расстояние для перемещения от базы данных к API, также «по проводам», и этого не происходит, если в вашей базе данных также работает localhost.

Решение состоит в том, чтобы реализовать пейджинг в вашем API и на внешнем интерфейсе: enter image description here

Вы упомянули требование: «но бизнес-предпочтение состоит в том, чтобы иметь все и позволить внешней таблице сортировать и фильтровать ее».

Сортировка и фильтрация также выполняются в сочетании с подкачкой: enter image description here

Возможно, вы сначала этого не поняли, но это одна из самых распространенных проблем с веб-приложениями, и она всегда решается с помощью медлительной загрузки веб-страниц и веб-элементов управления с подкачкой или вертикальной прокруткой. Загрузка всех данных, чтобы интерфейс мог выполнять разбиение по страницам, сортировку и фильтрацию, является неправильным способом решения проблемы.

...