リソースを複数のポイントからポイントXに移動する最適な方法を計算するアルゴリズムを開発中です。このプロセスは次のようになります。ビジネスロジック(c#)をトランザクション(SQL)に渡すと、パフォーマンスが向上しますか?
1)すべてのルートを取得するためにDBヒット溶液に関与する)
2)全ての可能な出発点を
3を取得)すべてのルートを結合双方向グラフを構築します。最初:
----- foreachの開始点----
4)は、(我々はパスEIの特定の数にこれを制限ホフマンPavleyアルゴリズムを用いてK-最短経路を計算します10回のshortesパス)実際の出発点のため
----- foreachのパスが-----
5)どのくらいのリソースW経路計算を評価しますeは各ルートノードから目的地まで運ぶことができます
6)各ポイントから移動したリソースの数と、このポイントに含まれる移動とトランス出荷の数(ある輸送から別の輸送へのリソースの移動)に応じて句読点を割り当てます可能な解決策。
-----実際の起点のエンドforeachのパス-----
----- ENDのforeachの開始点----
7)リターンこの擬似解法は、句読法によって順序付けされています。
このロジックの最初のバージョンは、解を計算するために約1分かかりました。しかし、2番目のリビジョンではSelect N + 1の問題がたくさんあることがわかりましたので、クエリーを最適化し(すべてではない)、変数の数に応じてそれぞれの実行に3〜10秒かかりました。
しかし、誰かがすべてのロジックを渡してSQLを処理するように提案し、SQLサーバーがその計算をすべて処理できるようにすると、すべてのデータが既にSQL Server上にあるので、データベースがすべてのすべての選択されたN + 1および遅延ロード問題を回避します。また、彼は同時性について懸念して、このロジックを実行している複数のユーザーがアプリケーションサーバーをダウンさせますが、SQL Serverはこの種の負荷を非常にうまく処理できます。
私の意見:Transact SQLに1500行のC#ロジックを渡す前に、すべてのクエリを最適化する必要があるかもしれません。また、いくつかの計算では、双方向グラフとHoffman Pavleyアルゴリズムのために第三者のライブラリを使用していますが、トランザクションでは使用できません。すでにトランザクションで書いたものを探すか、すべてのロジックを実装する必要があります。
注:私たちはORMとしてNhibernateを使用しています。
は限界に達するが+1にすることはできませんが、合意した、SQLへのロジックの移行は、実際のメンテナンスとパフォーマンスの痛みにつながります。 –