2016-10-20 1 views
0

私はSQLで新しいので、私の質問は幼稚そうだと私を許します。SQL Perfomance:多くのデータを1回取得するVS少ないデータを頻繁に取得する

自分のアプリケーションのちょうど簡単な説明:GUIelements、DataTableの:

  1. 私は、テーブル名を持つ2つのテーブルのSQLデータベースを持っています。
  2. GUIelementsテーブルデータテーブルは、300000のようなエントリ
  3. と非常に大きなテーブルである
  4. 微小50行テーブルであるまた、私は利用可能なデータに基づいて動的に生成されたGUIを持ったC#アプリケーションを持っている持っていますGUIエレメントで。
  5. C#アプリケーションには、GUIとは別のスレッドで実行される関数があります。この関数の目的は、GUIelementsテーブルを監視して、テーブルに変更があるかどうかを継続的に(1秒ごとに)監視することです。私は接続を開いたり、接続を照会したり閉じたりするたびにこれを行います。

GUIの更新はすべて正常に行われ、GUIのメインスレッドからデータベースでクエリを実行することもできます。すべてが完璧と思われます。

今==============================

私が実行されます別の関数を作成したいです再び10分ごとに実行される別のスレッドで実行されます。 この関数の目的は、DataTableのすべてのエントリを取得し、ローカルリストに取得した後、データの平均をとるような低レベルの処理を行います。

私の質問は以下のとおりです。

それは、一度SQLデータベースから全体のDataTableを取得し、一時リストに格納して処理を行う方が良いです:

USING()  
{  
- OpenConnection 
- Query & Store data in a big 300000 elements list 
- Close Connection 
- Process list  
} 

それともに良くなりますパケット内のDataTableからデータを取得し、各パケットを処理してから次のパケットを要求します。操作は次のようになります:

FOR LOOP 3 TIMES  
USING()  
{  
- OpenConnection 
- Query & Store data in a small 100000 elements list 
- Close Connection 
- Process list  
}  
END 

どのアプローチが良いでしょうか?

マルチスレッドのためにクエリが失敗する危険性はありますか?

表とリストのサイズは実際のものではありませんが、例としてこれらの数値を使用しています。

答えて

1

データ全体を保存するメモリがある場合は、1つの接続でデータを保存する方がよいでしょう。複数のネットワークラウンドトリップを避ける。したがって、解決方法は実際のサイズの数値に依存します。

AVGが必要な場合は、アプリに含まれていないデータベースで行います。

+0

ありがとうございました。申し訳ありませんが、私の例はあまり単純化されていませんでした。私は平均をしていない、私はもっと多くのことをするので、私はDBから実際のデータを持って来る必要があります...今データは数千のエントリのようですが、1ヶ月で数百万になる可能性があります。したがって、返されるデータが非常に大きくなる可能性がある場合は、2番目の方法が改善されていますか? – Spyros

+1

また、問題はデータの転送ではありません。問題は、使用可能なメモリの量に依存するため、アプリにどのように格納するかです。そして、さらに多くの計算を行う必要があるとしても、1つのストアプロシージャを使用してデータベース上で計算します。アイテムのリストを作成している場合は、すべてのデータをダウンロードしなければならない唯一のケースです。この場合、ページ設定のUIを行う必要があります。 –

+1

私はあなたがすべてのデータをダウンロードしたい別の風景で強靭です。場合は、オフライン機能が必要な場合は、レプリケーション機能を持つローカルDBを使用します。 –

関連する問題