1億の行を持つ子テーブルがあり、親テーブルの値を使用して5,000万行の列を更新する必要があります。十分なスペースがあれば、「選択したテーブルを作成する」が最も速くなるだろうと仮定して読んだことがありますが、誰かが同意しないか、他の要因が必要かどうかを知りたいと思っています。 pl/sqlのBULK COLLECT FORALL UPDATE機能を使用するよりも、このルートを使用する方が良いでしょうか?親テーブルの値を使用してテーブルの5,000万の子行を更新する
答えて
多くのデータがある場合は、UNDO表スペースを必要としないため、CREATE TABLE AS SELECTは確実に高速です。しかし、新しいテーブルのすべてのインデックスを再作成することは、名前の競合のためにかなり面倒なことがあります。
良いニュースは:50分の行は実際には多くのデータではありません。あなたが近代的なミッドレンジサーバーを持っていれば、それは問題を起こすべきではないので、余分な作業の価値はありません。見つかる最善の方法は、元のテーブル(すべてのインデックスを含む)のコピーを作成し、そこで更新を試みることです。それからあなたはどれくらいの時間がかかるかを大まかに知ることができます。
おそらく、パラレルUPDATEは、子テーブルの大きな変更に最適なオプションです。
alter session enable parallel dml;
update /*+ parallel */ ...;
(あなたはEnterprise Editionの、十分な資源、正気の構成などをお持ちの場合)(あなたがparallel(8)
のように、異なる並列数値でプレイすることをお勧めします。デフォルトの並列度が十分に通常は良いです。しかし、いくつかのSPARCのようなプラットフォームは "CPU_COUNT"を膨らませてしまい、ばかばかしい並列性につながります)。
パラレル更新はではない可能性があります。最適な解決策です。オブジェクトの再作成は、REDOとUNDOの生成をほぼ完全に回避できるため、高速化できます。しかし、オブジェクトを再作成するのは通常バグがあり、その最適なパフォーマンスを得ることは難しいです。
- 補助金:ここ
は、あなたは、単にテーブルをドロップして再作成することを決定する前に考慮すべきものです。オブジェクトの再作成後に、オブジェクトの付与を保存して再適用します。
- 依存オブジェクト。プロセスは、すべてのオブジェクトと依存オブジェクトをまったく同じ方法で再作成する必要があります。これは、スキーマの複雑さによっては難しくなります。
DBMS_METADATA
は、扱いにくく、場合によっては、オブジェクトを同じようにしないでください。正確にはと同じです。代わりにDDLをハードコーディングする場合は、オブジェクトが変更されるたびにプロセスを更新することを忘れないでください。 - 無効なオブジェクトです。ほとんどのオブジェクトは、必要なときに自動的に再コンパイルされます。しかし、おそらく無効なオブジェクトを持っているのが悪いように見えるので、それを待つことはしたくないでしょう。そして、正しくコンパイルしたとしても、いくつかのプログラムがこれらの厄介な問題を引き起こす可能性があります。
ORA-04068: existing state of packages has been discarded
(ほとんどのPL/SQLプログラマはセッション・ステートを認識せず、すべてのパッケージ変数をデフォルトでパブリックにするためです)。 - 統計。テーブルが再作成された後で単にそれらを再収集するだけでは必ずしも十分ではありません。ヒストグラムは、列が述語で使用されたかどうかによって異なります。表が再作成されると、すべての列が新規であり、最初にヒストグラムが作成されません。
- ダイレクト・パス・ライトは難解です。親子表には外部キーが含まれているため、通常はダイレクト・パス・ライトができません。プロセスは、外部キーを無効にするか、または削除する必要があります。また、テーブルとインデックスを
NOLOGGING
に設定し、最後にLOGGING
に戻すように設定することを忘れないでください。外部キーを再作成するときは、並列に行う場合は最初にNOVALIDATE
という名前で作成し、テーブルをパラレルに設定し、制約を検証してからテーブルをNOPARALLEL
に戻す必要があります。
大きなデータウェアハウスでは、すべての問題を処理するためのすべての手順とビルドコードを実行する価値があります。これがあなたの唯一の大きなテーブルである場合は、UPDATE
その作業を避け、わずかに最適ではないソリューションを受け入れることをお勧めします。
- 1. oracleの子テーブルの値を考慮して親テーブルを更新する
- 2. 子テーブルのトリガーを使用して親テーブルの値を設定する方法
- 3. Apex Oracle SQLの別のテーブルの行値を使用してテーブルの行の値を更新する方法は?
- 4. MySqlを使用して子テーブルの最も強いステータスを持つ親テーブルを更新します。
- 5. 行数が10万を超えるテーブルのVarchar列の更新
- 6. 同じテーブルの値を使用してSQLテーブルの値を更新
- 7. 親テーブルに重複がある子テーブルを更新
- 8. サブテーブルを使用して別のテーブルを使用してテーブルを更新する
- 9. 子テーブルの複数の値に基づいて1つの親テーブルを更新する方法
- 10. JavaScriptを使用してテーブル行のインデックスを更新する
- 11. デフォルト値の何百万行のテーブルを変更
- 12. 休止子テーブル更新親オブジェクト
- 13. 子テーブルの更新
- 14. Oracle:他のテーブルの値を使用して更新
- 15. 数百万行のテーブルを含む2つのカラムを更新する
- 16. 新しいテーブル値を使用したデータベースの更新
- 17. 同じ接続オブジェクトを使用して親テーブルと子テーブルを削除する
- 18. ScalarでSqlalchemyを使用してテーブル行を更新する
- 19. 他の2つのテーブルの計算を使用してテーブルを更新する
- 20. シングルクエリを使用してMySQLテーブル内のすべての行を更新する
- 21. ms-accessテーブルの値を別のテーブルの値で更新する
- 22. oracleのlike節を使用して別のテーブルのテーブルを更新します。
- 23. 別のテーブル値に応じてテーブルを更新します。
- 24. テーブルを別のテーブルのフィールドにフォームを使用して更新する
- 25. SQL Server:別のテーブルのレコードを使用してテーブルを更新する
- 26. SSISパッケージを使用して別のテーブルのテーブルにデータを更新する
- 27. knexjsトランザクションを使用して親/子テーブルから行を削除する
- 28. 別のテーブルからの値でテーブル値を更新する
- 29. テーブルの値を別のテーブル値で更新するSQL Serverクエリ
- 30. SQL Serverトリガ:別のテーブルのCOUNTを使用してテーブルを更新します。
なぜ更新しないのですか - これはあなたがやっていることです –
そして、これを行う前に説明計画を投稿してください –
手順コードはSQL文よりも遅くなります。 – fg78nc