0

私たちの使命は次のとおりです。

  • クライアントからファイルを受け取ります。各ファイルには、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 ショップです。残念ながら、私たちはこのことについてほとんど初心者です。

4

3 に答える 3

0

マージ ツールを調べてみましたが、定義済みの一連のルールに基づいてどのデータ ソースが優先されるかを柔軟に示すことができるかどうかはわかりません。

この機能は、複数のメンバーが非常に異なるニーズを持つプロセスを利用できるようにするシステムを可能にするために重要です。

私が読んだことから、Merge 関数はソートされたユニオンに近いものです。

于 2010-03-22T18:45:44.530 に答える
0

SQL Server 2008 を使用している場合は、MERGE ステートメントを調べてください。これは、ここでの Upsert のニーズに適している可能性があります。

入力に条件付き分割を使用して、一致する要素に応じて行を別の処理段階に送信できますか? 12 個のテーブルのそれぞれに対してこれを行う必要があるように思えますが、これらのいくつかを並行して行うことができる可能性があります。

于 2010-03-17T15:32:50.797 に答える
0

外部システム入力については、製品で説明されているのと同様のアプローチを使用しています。(最大240列の数百のターゲットテーブルを処理します)あなたが説明したように、1行から100万行以上の行があります。

通常、単一の一括更新を設定しようとはせず、一度に 1 つの列の値を処理しようとします。それらがすべて同じデータ要素を表す単一の型であることを考えると、ステージング UPDATE ステートメントは単純です。通常、値をマッピングするためのスクラッチ テーブルを作成します。

UPDATE target SET target.column = mapping.resultcolumn WHERE target.sourcecolumn = mapping.sourcecolumn.

マッピングの設定には少し手間がかかりますが、この場合も一度に 1 つの列を処理します。

「恐ろしい」をどのように定義するのかわかりません。私たちの場合、このプロセスはバッチ モードで、通常は夜間に行われるため、絶対的なパフォーマンスが問題になることはほとんどありません。

編集: これらも構成可能なサイズのバッチで行うため、ワーキング セットと COMMIT は決して巨大ではありません。デフォルトでは 1 回のバッチで 1000 行ですが、特定の状況では最大 40,000 行のバッチが有効です。また、特定のテーブルの作業データにインデックスを追加します。

于 2010-03-22T19:06:59.287 に答える