私たちの使命は次のとおりです。
- クライアントからファイルを受け取ります。各ファイルには、1 ~ 1,000,000 のレコードが含まれます。
- レコードがステージング領域にロードされ、ビジネス ルールの検証が適用されます。
- 有効なレコードは、次のルールに従ってバッチ方式で OLTP データベースに送り込まれます。
- レコードが存在しない場合 (キーがあるため、これは問題ではありません)、作成します。
- レコードが存在する場合、オプションで各データベース フィールドを更新します。決定は 3 つの要因のいずれかに基づいて下されます...それらの要因が何であるかは重要ではないと思います。
私たちの主な問題は、オプションでフィールド レベルでデータを更新する効率的な方法を見つけることです。これは、各テーブルに 10 から 150 のフィールドを含む、最大 12 の異なるデータベース テーブルに適用できます (元の DB 設計には多くの要望が残されていますが、実際にはそうなっています)。
私たちの最初の試みは、ステージング環境 (システム フィールドごとにステージングの 1 つのフィールド) を反映し、マスキング フラグを含むテーブルを導入することでした。マスキング フラグの値は、3 つの要素を表します。
次に、次のような UPDATE を配置しました...
UPDATE OLTPTable1 SET Field1 = CASE
WHEN Mask.Field1 = 0 THEN Staging.Field1
WHEN Mask.Field1 = 1 THEN COALESCE( Staging.Field1 , OLTPTable1.Field1 )
WHEN Mask.Field1 = 2 THEN COALESCE( OLTPTable1.Field1 , Staging.Field1 )
...
ご想像のとおり、パフォーマンスはかなり恐ろしいものです。
誰かが同様の要件に取り組みましたか?
私たちは、Windows サービスを使用して、データ処理を処理する SSIS パッケージを起動する MS ショップです。残念ながら、私たちはこのことについてほとんど初心者です。