私はSQLで新しいので、私の質問は幼稚そうだと私を許します。SQL Perfomance:多くのデータを1回取得するVS少ないデータを頻繁に取得する
自分のアプリケーションのちょうど簡単な説明:GUIelements、DataTableの:
- 私は、テーブル名を持つ2つのテーブルのSQLデータベースを持っています。
- GUIelementsテーブルデータテーブルは、300000のようなエントリ
- と非常に大きなテーブルである
- 微小50行テーブルであるまた、私は利用可能なデータに基づいて動的に生成されたGUIを持ったC#アプリケーションを持っている持っていますGUIエレメントで。
- 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
どのアプローチが良いでしょうか?
マルチスレッドのためにクエリが失敗する危険性はありますか?
表とリストのサイズは実際のものではありませんが、例としてこれらの数値を使用しています。
ありがとうございました。申し訳ありませんが、私の例はあまり単純化されていませんでした。私は平均をしていない、私はもっと多くのことをするので、私はDBから実際のデータを持って来る必要があります...今データは数千のエントリのようですが、1ヶ月で数百万になる可能性があります。したがって、返されるデータが非常に大きくなる可能性がある場合は、2番目の方法が改善されていますか? – Spyros
また、問題はデータの転送ではありません。問題は、使用可能なメモリの量に依存するため、アプリにどのように格納するかです。そして、さらに多くの計算を行う必要があるとしても、1つのストアプロシージャを使用してデータベース上で計算します。アイテムのリストを作成している場合は、すべてのデータをダウンロードしなければならない唯一のケースです。この場合、ページ設定のUIを行う必要があります。 –
私はあなたがすべてのデータをダウンロードしたい別の風景で強靭です。場合は、オフライン機能が必要な場合は、レプリケーション機能を持つローカルDBを使用します。 –