1

db2とsybaseの間でデータを移動するJavaのデータアーカイブプロセスがあります。参考までに-実行時に使用可能な各テーブルにはいくつかの条件があり、このプロセスはJavaで開発されているため、これはインポート/エクスポートプロセスでは実行されません。

現在、データが複数のスレッドで移動されるように、ソースと宛先の組み合わせごとに単一のDatabaseReaderとDatabaseWriterが定義されています。ソースと宛先の組み合わせごとに複数のDatabaseReaderと複数のDatabaseWriterを定義できるように、これをさらに拡張したいと思います。

したがって、たとえば、ソースデータが約100行で、10個のリーダーと10個のライターを定義した場合、各リーダーは10行を読み取り、それらをライターに渡します。サーバーで利用可能なリソース(CPU、メモリなど)に応じて、プロセスによって極端なパフォーマンスが得られることを願っています。

しかし、問題は、これらのソーステーブルに主キーがなく、複数のセットの行を取得することが非常に難しいことだと思います。

Oracleはrownumの概念を提供しており、そこでの生活ははるかに単純だと思います。しかし、db2はどうでしょうか。db2でこの動作を実現するにはどうすればよいですか?最初の10レコードをフェッチしてから、次の10レコードをフェッチするという方法はありますか?

何か提案/アイデアはありますか?

Db2バージョン-DB2v8.1.0.144フィックスパック番号-16Linux

4

2 に答える 2

0

私が正しく理解していれば、10行のバッチでターゲットテーブルに書き込もうとしているだけです。読み取りを 10 行にバッチ処理する必要はありません。

select ステートメントを起動するだけで、データがなくなるまで読み続けます。10 行ごとに、ライターを呼び出すことができます。ただし、ほとんどの jdbc クライアントは、この種の最適化を内部で実行するため、行を 1 つずつ挿入するよりも優れているとは言えません。

とにかくターゲットデータベースエンジンがほとんどの作業を行っており、マルチスレッドが役に立たない(または悪化する)ログ書き込みとロックによって制約されるため、ニーブマルチスレッド実装が物事を高速化するのではないかと私は疑っています。

私が見る限り、単純なシングルスレッドの「選択」/「挿入」プロセスは、マルチスレッドプログラムよりも簡単に優れています。これを最適化する他の方法があります:-

  1. ネットワーク操作がバッチ処理されるように、データベース クライアントを調整します。
  2. 100回程度の挿入ごとにコミットするように、「COMMIT」処理を調べます。
于 2010-04-29T04:56:31.913 に答える
-1

実際、DB2 は rownum の概念をサポートしています。データベーススキーマがわからない場合、これは例です:

SELECT *
FROM (
  SELECT rownumber() OVER (order by column1, column2) AS number, column1, column2
  FROM mytable
) temp
WHERE number BETWEEN 20 AND 30

ここでのサブクエリは、テーブル内のすべての行を取得し、指定された順序に基づいて行番号関数が割り当てられます。「外部」クエリでは、行番号を使用して、バッチに実際に必要な行を選択できます。

于 2010-04-15T05:03:07.037 に答える