2017-07-12 6 views
0

1億の行を持つ子テーブルがあり、親テーブルの値を使用して5,000万行の列を更新する必要があります。十分なスペースがあれば、「選択したテーブルを作成する」が最も速くなるだろうと仮定して読んだことがありますが、誰かが同意しないか、他の要因が必要かどうかを知りたいと思っています。 pl/sqlのBULK COLLECT FORALL UPDATE機能を使用するよりも、このルートを使用する方が良いでしょうか?親テーブルの値を使用してテーブルの5,000万の子行を更新する

+2

なぜ更新しないのですか - これはあなたがやっていることです –

+2

そして、これを行う前に説明計画を投稿してください –

+2

手順コードはSQL文よりも遅くなります。 – fg78nc

答えて

1

多くのデータがある場合は、UNDO表スペースを必要としないため、CREATE TABLE AS SELECTは確実に高速です。しかし、新しいテーブルのすべてのインデックスを再作成することは、名前の競合のためにかなり面倒なことがあります。

良いニュースは:50分の行は実際には多くのデータではありません。あなたが近代的なミッドレンジサーバーを持っていれば、それは問題を起こすべきではないので、余分な作業の価値はありません。見つかる最善の方法は、元のテーブル(すべてのインデックスを含む)のコピーを作成し、そこで更新を試みることです。それからあなたはどれくらいの時間がかかるかを大まかに知ることができます。

0

おそらく、パラレルUPDATEは、子テーブルの大きな変更に最適なオプションです。

alter session enable parallel dml; 
update /*+ parallel */ ...; 

(あなたはEnterprise Editionの、十分な資源、正気の構成などをお持ちの場合)(あなたがparallel(8)のように、異なる並列数値でプレイすることをお勧めします。デフォルトの並列度が十分に通常は良いです。しかし、いくつかのSPARCのようなプラットフォームは "CPU_COUNT"を膨らませてしまい、ばかばかしい並列性につながります)。

パラレル更新はではない可能性があります。最適な解決策です。オブジェクトの再作成は、REDOとUNDOの生成をほぼ完全に回避できるため、高速化できます。しかし、オブジェクトを再作成するのは通常バグがあり、その最適なパフォーマンスを得ることは難しいです。

  1. 補助金:ここ

    は、あなたは、単にテーブルをドロップして再作成することを決定する前に考慮すべきものです。オブジェクトの再作成後に、オブジェクトの付与を保存して再適用します。

  2. 依存オブジェクト。プロセスは、すべてのオブジェクトと依存オブジェクトをまったく同じ方法で再作成する必要があります。これは、スキーマの複雑さによっては難しくなります。 DBMS_METADATAは、扱いにくく、場合によっては、オブジェクトを同じようにしないでください。正確にはと同じです。代わりにDDLをハードコーディングする場合は、オブジェクトが変更されるたびにプロセスを更新することを忘れないでください。
  3. 無効なオブジェクトです。ほとんどのオブジェクトは、必要なときに自動的に再コンパイルされます。しかし、おそらく無効なオブジェクトを持っているのが悪いように見えるので、それを待つことはしたくないでしょう。そして、正しくコンパイルしたとしても、いくつかのプログラムがこれらの厄介な問題を引き起こす可能性があります。ORA-04068: existing state of packages has been discarded (ほとんどのPL/SQLプログラマはセッション・ステートを認識せず、すべてのパッケージ変数をデフォルトでパブリックにするためです)。
  4. 統計。テーブルが再作成された後で単にそれらを再収集するだけでは必ずしも十分ではありません。ヒストグラムは、列が述語で使用されたかどうかによって異なります。表が再作成されると、すべての列が新規であり、最初にヒストグラムが作成されません。
  5. ダイレクト・パス・ライトは難解です。親子表には外部キーが含まれているため、通常はダイレクト・パス・ライトができません。プロセスは、外部キーを無効にするか、または削除する必要があります。また、テーブルとインデックスをNOLOGGINGに設定し、最後にLOGGINGに戻すように設定することを忘れないでください。外部キーを再作成するときは、並列に行う場合は最初にNOVALIDATEという名前で作成し、テーブルをパラレルに設定し、制約を検証してからテーブルをNOPARALLELに戻す必要があります。

大きなデータウェアハウスでは、すべての問題を処理するためのすべての手順とビルドコードを実行する価値があります。これがあなたの唯一の大きなテーブルである場合は、UPDATEその作業を避け、わずかに最適ではないソリューションを受け入れることをお勧めします。

関連する問題