0

I am currently writing an application that needs to be able to select a subset of IDs from Millions of users...

I am currently writing software to select a group of 100.000 IDs from a table that contains the whole list of Brazilian population 200.000.000 (200M), I need to be able to do this in a reasonable amount of time... ID on Table = ID on XML

I am thinking of parsing the xml file and starting a thread that performs a SELECT statement on a database, I would need a connection for each thread, still this way seems like a brute force approach, perhaps there is a more elegant way?

1) what is the best database to do this? 2) what is a reasonable limit to the amount of db connections?

4

4 に答える 4

2

100.000 のクエリを作成するには長い時間がかかり、作業を別々のスレッドに分割しても、同じテーブルから読み取る場合にはあまり役に立ちません。

一度に 1 つのレコードを取得するのではなく、100.000 アイテムを適切な小さなバッチ (たとえば、それぞれ 1000 アイテム) に分割して、データベースに送信できるようにします。これらの id 値を使用してデータベースに一時テーブルを作成し、データベース テーブルに対して結合を行ってそれらのレコードを取得します。

たとえば、MS SQL Server を使用すると、アイテムのバッチを XML としてストアド プロシージャに送信できます。ストアド プロシージャは、そこから一時テーブルを作成し、データベース テーブルにクエリを実行できます。

于 2012-10-09T23:29:22.610 に答える
1

既存の 2 億行のテーブルを処理できる最新の DBMS は、10 万行のテーブルと比較しても問題ありません (ハードウェアが問題ないと仮定します)。

理想的な解決策: XML (少なくとも ID) を新しいテーブルにインポートし、比較する列が正しくインデックス付けされていることを確認します。そして、クエリします。

于 2012-10-09T23:38:57.597 に答える
0

何語?.NET を使用している場合は、XML と SQL をデータソースとしてロードできます。データの比較に使用できる列挙可能な関数がいくつかあると思います。

于 2012-10-09T23:22:20.923 に答える
0

これを行う:

  • XML を解析し、抽出した ID を一時テーブルに格納します1
  • メイン テーブルから、ID が一時テーブルにも存在する行のみを選択します。

    SELECT * FROM MAIN_TABLE WHERE ID IN (一時テーブルから ID を選択)

適切な DBMS は通常、バッチ処理/チャンク処理と並列化を使用したとしても、通常、自分よりも速く処理を実行します。


1一時テーブルは通常、CREATE [GLOBAL|LOCAL] TEMPORARY TABLE ...構文を使用して作成され、おそらくセッションに対してプライベートにする必要があります (これについては、DBMS のGLOBALvs.の解釈を確認してくださいLOCAL)。選択した DBMS が一時テーブルをサポートしていない場合は、代わりに「通常の」テーブルを使用できますが、使用中に同時セッションがそのテーブルを台無しにしないように注意してください。

于 2012-10-10T12:49:33.883 に答える