7

これで、すべてがRAMメモリにロードされた後に処理する必要がある1.000.000のfirebirdデータベースができました。これらすべてを取得するには、(*最初の1000 ...を選択)を使用して8時間データを抽出する必要があります。これに対する解決策は何ですか?

4

5 に答える 5

4

あなたの「select*first 1000」(あなたが説明したように)のそれぞれは、全表スキャンを行いますか?それらのクエリを見て、インデックスを使用していることを確認してください。

于 2010-04-20T17:22:59.650 に答える
1

各データ読み取りで作成している DTO オブジェクトを構築するのにどのくらいの時間がかかりますか?

{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); }

これらのオブジェクトを何百万も作成しています。1 つの DTO オブジェクトを作成するのに 29 ミリ秒かかる場合、完了するまでに 8 時間以上かかることになります。

于 2010-04-20T19:30:14.573 に答える
1

Firebird db を使用して C# で 1.000.000 行のテーブルからデータをロードするには、Pentium 4 3Ghz で少なくとも 8 時間かかります

データベースからレコードを選択するために SQL クエリを実行していると誰もが想定していました。

select * 
from your_big_table
/

それは本当に数秒かかるからです。画面に表示するには少し時間がかかりますが、実際の選択の実行は非常に高速です。

しかし、C# への言及は、あなたが何か他のことをしていると思わせます。おそらく、あなたが実際に持っているのは、100 万個のオブジェクトをインスタンス化する RBAR ループです。もう少し時間がかかることがわかります。それにしても8時間?時間はどこへ行く?

編集

私の推測は正しかったので、ループで 1000000 個のオブジェクトをインスタンス化しています。正しいアドバイスは、すべてのオブジェクトをメモリに入れたら、何をするにしても他の方法を見つけることです。詳細を知らなければ、詳細を示すのは困難です。しかし、これが UI の考え方である可能性は低いと思われます。何百万ものオブジェクトを熟読するのはどのユーザーでしょうか?

したがって、一般的な観察で十分である必要があります。一括操作を使用して、一括アクティビティを実装します。SQL データベースはセットの処理に優れています。SQL の機能を活用して、100 万行を個々の行としてではなく、1 つのセットとして処理します。

この回答が役に立たない場合は、達成しようとしている欲求に関する詳細をお知らせください。

于 2010-04-20T17:39:37.287 に答える
0

これを見てください: http ://www.firebirdfaq.org/faq13/

于 2010-04-20T17:21:27.140 に答える
0

それらをメモリにロードし、SQL ステートメントを介して処理するだけでなく、どのような処理を行う必要がありますか?

私がやろうとしていることに応じて、私が使用する2つのテクニックがあります。

  1. ある種の人工キー (ID) があると仮定して、バッチで作業し、最後に処理された ID 値をインクリメントします。

  2. BCP でデータをテキスト ファイルに出力し、更新を繰り返してから BCP に戻します。IN ステップの前に制約とインデックスをオフにすることを忘れないでください。

于 2010-04-20T17:15:36.027 に答える