2012-03-18 7 views
1

C#、.NET 3.5フレームワーク、およびSQL Server 2008 R2を使用して高頻度取引アプリケーションを開発しています。私は70の楽器を購読しています。それぞれの楽器で1分の小節を保存しています。各器具の各バーは、Open Price,High Price,Low Price,Close Price,Volumeからなる。C#コードとSQ​​L Server 2008ストアドプロシージャのパフォーマンス比較

プライマリキーがStockIDである共通の1つのテーブルで、各楽器の1分の小節をすべてプッシュします。

今、いくつかの計算のために。私は1分のバーから5分のバー、10分のバー、15分のバーなどを構築する必要があります。例:1分の棒の最後の5行をループし、棒の大きさ= 5分の最初の棒を作成します。そしてその5分のバーの中で私はOpen PriceHigh PriceLow PriceClose PriceVolumeを見つける必要があります。同様に、私は180、5分のバーが必要になります。だから、私は180 * 5 = 900行1分のバーが必要になります。私はすべて900の1分のデータを取得し、ループとで5分のバーで180のデータを作成するために、C#コードから簡単なSELECT文を実行すると

  1. (900から、私は180行5分のそれぞれを構築します)私のC#のコードと各5分のバーでオープン価格、高価格、近い価格、ボリュームを取得します。

  2. または、私は上記と同じことをして、オープン価格、高価格、低価格、近い価格、C#コードに5分の棒のすべての180データのボリュームを返します。

私の質問は、はるかに高速1)または2)と1より堅牢になる)または2)

希望、私は専門家のために詳細に私の質問やシナリオを額装しているされる、あります教えて。

+1

私の経験から、ストアドプロシージャはサーバー間のクエリ数を減らすので、はるかに高速です – Mathieu

+1

もう1つの「自分で測定してください。少なくとも、あなたは保守性について幾分尋ねています。 – Marc

+0

これは、クライアントの速度、サーバーの速度、ネットワークの待ち時間、データの量、インデックス、s'procの品質など、さまざまな変数に依存します。自分でテストする必要があります。 – Phil

答えて

5

あなたは "ループ"の観点から考えています。リレーショナルデータベースでは、 "集合"の観点から考える必要があります。ストアドプロシージャでのループの操作は、多くの場合、カーソルで行われます。それは遅い(ワーキングセット指向よりも50〜100倍遅い)、カーソルに関連付けられたロック機構が他のプロセスをロックアウトする可能性があります。だからあなたはいつもそれらの使用を避けるべきです。

最速のソリューションは、ストアドプロシージャを使用しています。それについての議論はありません。最大の違いは、すべてのネットワークトラフィックが削減されることです。 SPはデータベース上で直接実行され、ネットワークトラフィックのスローダウンはありません。デバッグするのは苦労するかもしれませんが、Visual Studio 2010にはいくつかの改善点があります。

次に、ストアドプロシージャを実装する方法を考える必要があります。ループとカーソルの遅いロック方法、または高速設定の方向に進むことができます。唯一必要なデータを保持しているすべてのデータを1つの定期的なテーブルを、他の「ウィンドウ・テーブル」:

あなたの説明に基づいて、あなたは2つの表にいくつかのデータを維持することにより、パフォーマンスのたくさんを得るかもしれませんがそれらの5分、10分、および15分のバーを設定します。 3つの最後の5分のバーのデータで15分のバーを作成することができます、そして、それらの最後の5分のバーをウィンドウテーブルに保存します。新しい5分のバー。最後の2分15分のバーに基づいて新しい30分のバーを作成することができたら、それらの2分15分のバーを保存します。このウィンドウのテーブルをできるだけ小さく保つようにしてください。時間。

3
  • ストアドプロシージャの方が高速です。少なくとも、SQL ServerとC#アプリの間で必要なすべてのデータを転送する必要がないためです。
  • しかし、ストアドプロシージャは少ないrebustと維持するのが非常に難しいと思います。