2010-12-15 16 views
0

リソースを複数のポイントからポイント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を使用しています。

答えて

2

SQLにロジックを移動すると役立つかもしれませんが、それはコストがあります。

  • は、C#コードの1500行と同じことが、本当の地獄(100ライン・クエリ、ストアドプロシージャでないSQLを維持
  • )など、新機能を追加した後、期限切れのになるデバッグだから私の意見は、データベースへのすべてのロジックを移行する前に、あなたのクエリを最適化しようとするべきであるということですはるか

複雑です。

+0

は限界に達するが+1にすることはできませんが、合意した、SQLへのロジックの移行は、実際のメンテナンスとパフォーマンスの痛みにつながります。 –

1

最後の手段としてロジックをデータベースに移動することを検討します。

  • データベースで設定された処理を維持し、アプリケーションで処理を繰り返すことをお勧めします。あなたはforeachステートメントをいくつも持っています。セット操作にフラット化できない限り、データベースの世界では本当に苦しんでいます。

  • ビジネスルールのアプリケーションの場合は、データベースに入れる理由がないかぎり、アプリケーションレイヤー内になければなりません。

  • 1500行をコード化してTSQLに移植するには、多くの時間がかかります。 .NET CLRは、最近のバージョンのMSSQLであれば使用できますが、Windows Server上の.NETよりかなり遅いです。

  • 必要なデータをすべて前に引き上げるのは比較的簡単ですN + 1が選択される。 すべてを取得し、すべてを適切なオブジェクトグラフに結合します。

最後に、最初の4つの手順がすべての要求に対して複製されているようです。すべてのデータを選択して最初の4つのステップを処理し、グラフをメモリに保持して、各要求ごとにすべてのデータを取得して前処理することを大幅に前倒しすることは避けてください。これは可能ではないかもしれませんが、データ検索の問題は完全に取り除かれます。

、多くの場合、あなたのような複雑なレポート要件のパフォーマンスの向上につながることができ、データベースにロジックをシフト:

1

は、ここでの契約です。これは、データのより良い索引付けによって達成されます。つまり、索引は挿入時に作業の多く(つまりソート)が実行されることを意味します。

必要なインデックスの挿入時にソート作業が行われるため、挿入やその他の書き込み操作が遅くなります。これはしばしばあなたのレポート以上のことをする必要のあるシステムでは有害です。

また、ある時点では、アプリの規模がどのように変化するか考えたいと思うでしょう。これを行うときは、データベースサーバーが既に高価なサーバーである可能性が高く、アップグレードするには最も高価なサーバーである可能性が高いと考えてください。ライセンシングコストだけでは、データベースサーバのアップグレードが予算管理者の手間を軽減します。また、データベースは通常、クラスタ内で作業するのが難しいです。データベースと比較して、Webサーバーやアプリケーションサーバーを追加してファーム内で動作させることは、公園内を歩くことです。これらの理由から、データベースからのパフォーマンスへの圧力を解放するためにできることは、アプリの拡張の方法を改善する可能性があります。

1

それはとても一般的である最適化問題への洞察を提供するのは難しいが、文:すべてのデータは、すべての計算を行うには、データベースのためのより少ない時間がかかりますSQL Server上で、すでにあるよう

は必ずしも真ではありません。 t-sqlへのC#コードのまっすぐなポートは、論理をまったく変更しなければ実行するのと同じくらい多くのクエリを実行します。 SQLサーバーとアプリケーションを実行しているマシンの間でデータを転送するのにかかる時間は節約できますが、ボトルネックであるか、SQLサーバーがこれらのすべてのクエリを実際に実行するのにかかるのでしょうか?これらの各クエリの結果はどれくらいの大きさですか?

他の質問は、ここに含まれるすべての計算を行う上で、テーブル内のデータを繰り返し処理し、そのデータで何かを行うという点で、t-sqlの方が速いでしょうか?疑わしい。実際に処理している時間(データベースを待つのではなく)に応じて、時間がかかることもあります。

ボトムラインは、このアプローチを遠隔的に検討している場合でも、時間がどこにあるのかを正確に判断し、何が得られるかを確認するために多くのテストを行う必要がある場合は、 、もしあれば。

関連する問題