2016-12-16 12 views
0

アプリケーション内の一部のテーブルを、毎週または隔週更新するいくつかの他のウェアハウステーブルから更新する必要があります。私はそれらに基づいて私のテーブルを更新する必要があります。そして、これらは別のテーブルに外部キーを持っています。だから私はテーブルを切り捨てて、毎回データ全体を再挿入することはできません。だから私はデルタを取って、それに応じて、変更されないいくつかの主キー列に基づいて更新する必要があります。このアプローチを実装する方法に関するいくつかのインプットが必要です。Oracle 12c - ウェアハウステーブルのデータに基づいてテーブル内のデータを更新する

私のアプローチ:
これらのテーブル、ビューの最終更新時刻を確認します。
最新のものであれば、テーブルとウェアハウステーブルのプライマリキーに基づいて各行を比較してください。
異なる場合は、各列を更新してください。
列に変更がない場合は何も行いません。
新しいレコードがある場合は挿入します。

私の質問:
どうすれば実装できますか? PL/SQLコードを書くことは、それが有効かつ効率的な方法ですか?予想されるレコード数は約800Kです。
サンプルコードまたはリンクをご記入ください。

+0

関連する行を判別するために使用できる、他のウェアハウスの各レコードにはタイムスタンプはありません。単一のマージステートメントが試行する最初の方法になります。次に、並列化を試みてください。 merge/* + parallel */ – user2672165

+0

質問は広範囲(IMHO)に答えることに関連しています。最良のソリューションは、構造、制約、行の数とサイズに応じて、テーブルごとに異なるアプローチを使用することもできます。例として使用する1つまたは2つのテーブルを選択し、構造、サイズ、インデックスを投稿することができますコードを改善するためのヘルプが必要です。また、800Kほどではないと考えてください。 – Aleksej

+1

宛先テーブルはソーステーブルの単純なコピーですか?宛先テーブルを更新する必要がありましたか、それとも単純に読み取り専用ですか? Enterprise Editionを使用している場合は、マテリアライズド・ビューが適しています。https://docs.oracle.com/database/121/REPLN/repmview.htm#REPLN003 –

答えて

0

私はPl/Sqlとbulk collect forallメソッドに行きます。データサイズを減らし、差を計算するために、カーソルにマイナスを使用することができます。

あなたはFORALLやエンジン、収集バルクの詳細については、このサイトをチェックすることができます。http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html

0

あり上記あなたの質問に多くの部分があり、私は私ができるように最善をお答えします:

  1. ことながら外部キーの参照を無効にする、テーブルを切り捨てる、更新されたデータでテーブルを再投入する、外部キーを再度有効にする、上記の必要条件を満たしたテーブルを最適化するたびに切り捨てるとは思わない
  2. はい、 PL/SQLは良い方法ですあなたは に欠けているものを達成、これはネイティブSQLおよびPL/SQLに対処するには複雑すぎるとして実現概念的

効率的な代替手段で次のように、私はかかるだろうなアプローチのようなものです:

初期セットアップ:

  1. activity_seqと呼ばれるシーケンスを作成するユニーク制約
  2. 0を使用して、ソース表にタイプ番号の「ACTIVITY_ID」欄を追加トリガーをソーステーブルのactivity_id = activity_seq設定に追加します。テーブルの行
  3. 「最後に処理されたアクティビティID」を保持するためにマスターテーブルのいくつかの種類を作成/隔週その後値

の各挿入/更新のためのNEXTVALは:

  1. の値を取得します テーブル
  2. アクティビティID値> "最後に処理されたアクティビティID"値
  3. ソーステーブル内のすべての行を選択します。ターゲットと一致するものが見つかった場合は と一致するものが見つからない場合は、ターゲットに新しい行を挿入してください( と言いますので、削除はありません)
  4. が完了したら、上記の手順3で処理したソース行 のアクティビティIDの最大値にマスターテーブル「最後に処理したアクティビティID」を更新します。

(つまり、お使いの環境および処理された行の数に応じて、上記のプロセスは、トランザクションの数に分割し、繰り返しが必要になる場合がありますのでご注意ください)私は願っています、これは役に立つことを証明

関連する問題