1

実行する必要のあるデータ分析があります。平均すると、50Kから150Kの行の間のどこかに関係します。これらの行から、5つの異なる基準に基づいてSum(X)とCount(X)の合計を抽出する必要があります。それについては2つの方法があります。

  1. Sum()またはCount()を使用して列Xのデータを集約するように設計された10個の異なるクエリを記述します。それぞれを実行し、SqlCommand.ExecuteScalar()を使用して結果を取得します。
  2. さまざまな条件を評価するために必要となるさまざまなパラメーターをすべて含むカスタムオブジェクトを作成します。SqlCommand.ExecuteDataReader()を使用して、さまざまな条件付きサブセットをすべて含むスーパーセットを構成するために必要なすべてのデータを返す1つのクエリを実行します。DataReaderから各行を新しいオブジェクトに読み込み、各行をListコレクションに追加します。すべてのデータが取得されたら、Linq-to-Objectを使用して、さまざまな条件に基づいて必要なさまざまなSum()値とCount()値を決定します。

それぞれを試してどれが最も速いかを確認できることは知っていますが、どちらがより速くなる可能性があるかについてのコミュニティのアドバイスに興味があります。SQLServerとWebServerがそれぞれ独自のマシンで実行されており、それぞれに十分なメモリがあると想定します。

現在、オプション1に傾いています。DBへのクエリは他にもたくさんありますが、DB自体がすべての集計作業を実行し、SQLServerとWebサーバーの間で渡されるデータはごくわずかです。オプション2では、クエリは1つだけですが、非常に大量のデータを.Netに渡すため、.Netは、集計関数に関するすべての面倒な作業を実行する必要があります(ただし、私は実行しません)。基礎となるものは何でもありますが、SQL Serverは、これらのタイプの大きな集計関数を実行するのにより効率的であると思われます)。

どちらに進むべきか(または私が見逃している3番目のオプション)について何か考えはありますか?

4

2 に答える 2

1

ご存知のとおり、オプション1を使用します。特に列が多すぎない場合は、50〜150k行は実際にはそれほど多くの行IMOではありません。

何百万もの行について話し始めたら、最適化について考え始めます。

もう1つのこと:データベースの場合と同様に、クエリがインデックスに正しくヒットすることを確認してください。それはあなたの2つのアイデアの違いよりもはるかに重要です。

于 2009-10-19T00:38:08.027 に答える
1

データベースは一般的にこのようなデータを分析するための最良のオプションであり、私は#1に行きます。

ただし、3番目のオプションも検討します。このオプションでは、SQLに渡す単一のクエリを作成します(10個ではありません)。これには、データの1回のパスですべての作業を実行できるように、集計関数にCASEステートメントを配置することが含まれる場合があります。

PIVOTを行う古い方法を考えてみましょう。

SELECT 
   SUM(CASE WHEN ConditionX = 1 THEN SomeField END) AS SUM1
   SUM(CASE WHEN ConditionX = 2 THEN SomeField END) AS SUM2
FROM SourceData
;
于 2009-10-19T01:48:23.023 に答える