私の過去からの反響が聞こえます。あなたが私の間違いを繰り返そうとしている場合に備えて、別のアプローチを提供したいと思います。それはあなたの状況に当てはまるかもしれないし、当てはまらないかもしれません。
データベースから大量のデータをフェッチしてから、データベースに永続的に戻す必要があると書きました。
処理する必要のある外部データをデータベースに一時的に挿入し、データベース内ですべての処理を実行することは可能でしょうか?これには、次の利点があります。
- 大量のデータを抽出する必要がなくなります
- 大量のデータを保持する必要がなくなります
- セットベースの処理を可能にします(手続き型よりも優れています)
- データベースがそれをサポートしている場合は、並列実行を利用できます
- プロセス中に発生したエラーについてレポートを作成するためのフレームワーク(テーブルとSQL)を提供します。
例を挙げると。ずっと前に、購入、支払い、および関連する顧客データをファイルから中央データベースにロードすることを目的とした(java)プログラムを実装しました。そのとき(そして私は深く後悔しています)、トランザクションを1つずつ処理する負荷を設計し、データごとにいくつかのデータベースルックアップ(sql)を実行し、最後に適切なテーブルにいくつかの挿入を実行しました。当然、ボリュームが増加すると、これはスケーリングしませんでした。
それから私は別の間違いをしました。問題だったのはデータベースだと思ったので( SELECTが遅いと聞いていたので)、データベースからすべてのデータを取り出して、JavaでALL処理することにしました。そして最後に、すべてのデータをデータベースに永続的に戻します。ロードプロセスを簡単に拡張するために、コールバックメカニズムを使用してあらゆる種類のレイヤーを実装しましたが、うまく機能させることができませんでした。
バックミラーを見ると、(笑いながら少量の)100,000行を一時的にテーブルに挿入し、そこから処理する必要がありました。処理に半日近くかかったのは、私が自由に使えるすべてのテクノロジーの力を発揮した場合、せいぜい数分かかったでしょう。