【发布时间】:2011-05-26 05:29:19
【问题描述】:
我们正在研究一种算法,计算通过可变路线将资源从多个点移动到点 X 的最佳方式,过程如下:
1) 获取所有可能的路由(数据库命中以获取解决方案中涉及的所有路由)
2) 获取所有可能的起点
3) 构建一个结合所有路线的双向图。
-----foreach 起点----
4) 使用 Hoffman Pavley 算法计算 k 最短路径(我们将其限制为一定数量的路径 ei:前 10 条最短路径)
-----foreach 实际起点的路径-----
5) 评估路由,计算我们可以从每个路由节点到目的地携带多少资源
6) 根据从每个点移动的资源数量以及此可能解决方案中涉及的移动和转运(将资源从一种运输方式移动到另一种运输方式)的数量来分配标点符号。
-----END foreach 实际起点的路径-----
-----END foreach 起点----
7) 返回按标点符号排序的可能解决方案
这个逻辑的第一个版本需要大约 1 分钟来计算解决方案。但在第二次修订中,我们发现我们遇到了很多 Select N+1 问题,因此我们优化了查询(不是全部),现在每次运行大约需要 3-10 秒,具体取决于变量的数量。
但现在有人建议通过所有逻辑来处理 SQL,并让 SQL Server 处理所有计算,他说由于所有数据都已经在 SQL Server 上,数据库完成所有计算所需的时间会更少避免所有选择 N+1 和延迟加载问题。他还担心并发,多个用户运行这个逻辑会导致应用服务器宕机,但他说 sql-server 可以很好地处理这种负载。
我的意见:也许我们应该在尝试将 1500 行 c# 逻辑传递给 Transact SQL 之前尝试优化所有查询。更不用说对于某些计算,我们正在使用第三方库来实现交易中不可用的双向图和霍夫曼帕夫利算法,要么我们需要寻找其他已经在交易中编写的东西,要么我们自己实现所有这些逻辑。
注意:我们使用 Nhibernate 作为 ORM。
【问题讨论】:
标签: c# algorithm performance tsql