Мы работаем над алгоритмом, который рассчитывает оптимальный способ перемещения ресурсов из нескольких точек в точку X через переменные маршруты, и процесс идет следующим образом:
1) получить все возможные маршруты (попадание в БД для получениявсе маршруты, включенные в решение)
2) Получить все возможные отправные точки
3) Построить двунаправленный граф, объединяющий все маршруты.
---- foreach начальная точка ----
4) Вычислить k-кратчайший путь, используя алгоритм Хоффмана Павли (мы ограничиваем это определенным числом путей ei: первые 10 путей сокращают пути)
----- foreach путь для фактической начальной точки -----
5) оценить маршрут, подсчитав, сколько ресурсов мы можем перенести с каждого узла маршрута напункт назначения
6) Назначьте пунктуацию в зависимости от количества ресурсов, перемещаемых из каждой точки, а также количества перемещений и перегрузок (перемещения ресурсов из одного транспорта в другой), участвующих в этом возможное решение.
----- КОНЕЦ foreach для фактической начальной точки -----
----- КОНЕЦ foreach начальной точки ----
7) вернуть возможное решение, упорядоченное пунктуацией
Первая версия этой логики заняла ~ 1 мин для вычисления решений.Но во второй ревизии мы обнаружили, что у нас много проблем с Select N + 1, поэтому мы оптимизировали запросы (не все), и теперь каждый запуск занимает ~ 3-10 секунд, в зависимости от количества переменных.
Но теперь кто-то предложил передать всю эту логику для выполнения SQL и позволить SQL-серверу обрабатывать все эти вычисления, сказал он, поскольку все данные уже находятся на SQL-сервере, базе данных потребуется меньше времени для выполнения всех операций.расчет, избегающий всех выбранных проблем N + 1 и отложенной загрузки.Кроме того, он обеспокоен параллелизмом: несколько пользователей, использующих эту логику, приведут к остановке сервера приложений, но он сказал, что sql-сервер может очень хорошо справляться с такого рода нагрузками.
Мое мнение: возможно, мы должны попытаться оптимизировать все запросы, прежде чем пытаться передать 1500 строк логики c # в Transact SQL.И не говоря уже о том, что для некоторых вычислений мы используем сторонние библиотеки для двунаправленного графа и алгоритма Хоффмана Павли, которые недоступны в транзакции, либо нам нужно искать что-то еще, уже написанное в транзакции, или реализовывать всю эту логику самостоятельно.
ПРИМЕЧАНИЕ: мы используем Nhibernate в качестве ORM.