入力データとデータベース間の差異の効率的な処理


8

レコードが既存のデータベースに追加される入力データセットがあります。追加される前に、データは重い時間のかかる処理を経ます。処理時間を短縮するために、データベースに既に存在する入力データセットからレコードを除外したい。

入力とデータベースの違いを以下に示します。 入力とデータベースの違い

これは私が見ているプロセスの種類の概要です。入力データは最終的にデータベースに送られます。 入力処理ワークフロー

現在のソリューションでは、データベースと入力を組み合わせてMatcherトランスフォーマーを使用し、FeatureTypeFilterを使用してNotMatchedの結果をフィルタリングして、入力レコードのみを保持します。

差分機能を取得するより効率的な方法はありますか?


1
Oracleデータベースを使用していますか?あなたはMINUSの使用デルタテーブルの間に仕事をするために、データベースを得ることができますstackoverflow.com/questions/2293092/...を
Mapperz

2
データベースからすべてを読み取るのではなく、を使用してみてくださいSQLexecutor。イニシエーターの_matched_records属性が0の場合、それは追加です
MickyT

回答:


4

図に示されているデータベース特性がある場合。小さな入力、小さなオーバーラップ、大きなターゲット。次に、次の種類のワークスペースは、データベースに対して複数のクエリを実行する場合でも、非常に効率的に機能します。

ここに画像の説明を入力してください

したがって、データベース内の一致する機能の入力クエリから読み取られた各機能について。適切なインデックスがあることを確認してください。_matched_records属性を0でテストし、処理を行ってから、データベースに挿入します。


これが最速の解決策であることがわかりました。データベースからFMEに取り込まれるデータの量を制限し、SQL側の処理を維持するので、私は推測しています。
rovyko

4

私はFMEを使用しませんでしたが、5時間の処理ジョブの出力を使用して、低帯域幅ネットワークリンクを介した並列データベースの3つの可能な処理ケースを特定する必要がある同様の処理タスクがありました。

  • 追加する新機能
  • 更新される既存の機能
  • 削除する既存の機能

すべての機能がパス間で一意のID値を保持することが保証されていたため、次のことができました。

  1. 更新されたテーブルの重要な列全体で{uID、checksum}ペアのテーブルを生成した処理スクリプトを実行します
  2. 前のイテレーションで生成された{uID、checksum}ペアを使用して、uIDがチェックサムが一致しないサブクエリにある更新されたテーブルの行を含むターゲットテーブルに更新を送信しました
  3. 外部結合サブクエリが示した更新されたテーブルからの挿入を送信すると、一致しないuIDがありました。
  4. 現在のテーブルに一致するuIDがないことを外部結合サブクエリが示した外部テーブルの機能を削除するためにuIDのリストを送信しました
  5. 翌日の運用のために現在の{uID、checksum}ペアを保存します

外部データベースでは、新しい機能を挿入し、デルタを更新し、削除されたuIDの一時テーブルにデータを入力し、削除テーブル内の機能を削除するだけで済みました。

このプロセスを自動化して、1日の実行時間を20分未満にすることで、数百の毎日の変更を1000万行のテーブルに伝播し、本番テーブルへの影響を最小限に抑えることができました。同期を失うことなく、数年間最小限の管理コストで実行されました。

M行にわたってNの比較を行うことは確かに可能ですが、ダイジェスト/チェックサムを使用することは、はるかに低いコストで「既存の」テストを実行するための非常に魅力的な方法です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.