Oracleテーブルにデータを挿入する最速の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/143872

  •  02-07-2019
  •  | 
  •  

質問

データを処理してテーブルにロードするPL / SQLでデータ変換を記述しています。 PL / SQLプロファイラによると、変換の最も遅い部分の1つは、ターゲット表への実際の挿入です。テーブルには単一のインデックスがあります。

ロード用のデータを準備するには、テーブルの行タイプを使用して変数を設定し、次のようにテーブルに挿入します。

  

mytable値に挿入r_myRow;

次の操作を行うことでパフォーマンスを向上できるようです:

  • 挿入中にログオフする
  • 複数のレコードを一度に挿入

これらの方法はお勧めですか?もしそうなら、構文は何ですか?

役に立ちましたか?

解決

PL / SQLテーブルとFORALLを使用してinsertステートメントにバインドし、一度に数百行を挿入することをお勧めします。詳細については、こちらを参照してください。

PL / SQLテーブルの作成方法にも注意してください。可能な場合は、代わりに" INSERT INTO t1 SELECT ..."を使用して、SQLですべての変換を直接実行することをお勧めします。 PL / SQLで行ごとの操作を行うと、SQLよりも遅くなります。

どちらの場合でも、 INSERT / * + APPEND * / を使用して直接パス挿入を使用できます。これは基本的にDBキャッシュをバイパスし、新しいブロックを直接割り当ててデータファイルに書き込みます。また、使用方法によっては、ログの量を減らすこともできます。これにはいくつかの意味もあるため、 fineを読んでください。まずマニュアル

最後に、テーブルを切り詰めて再構築する場合は、最初にインデックスを削除(または使用不可としてマーク)してからインデックスを再構築する価値があります。

他のヒント

通常の挿入ステートメントは、テーブル内のデータを取得する最も遅い方法であり、一括挿入を意図していません。次の記事では、パフォーマンスを改善するためのさまざまな手法を参照しています。 http://www.dba-oracle .com / oracle_tips_data_load.htm

インデックスを削除しても速度が十分に向上しない場合は、 Oracle SQL * Loader が必要です:

http://www.oracle.com/technology /products/database/utilities/htdocs/sql_loader_overview.html

eid、ename、sal、jobを取得したとします。したがって、最初にテーブルを作成します。

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));

データの挿入:-

SQL>insert into tablename values(&eid,'&ename',&sal,'&job');

インデックスを削除してから行を挿入し、インデックスを再作成します。

このリンクを確認してください http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. 考慮すべき主なポイント ケースはこれとしてAppendヒントを使用することです テーブルに直接追加します freelistを使用する代わりに。ロギングをオフにする余裕がある場合は、nologgingヒント付きのappendを使用してそれを実行します
  2. PL / SQLで反復する代わりに一括挿入を使用する
  3. ファイルフィードからデータを取得する場合は、sqlloadedを使用してデータをテーブルに直接ロードします

おそらく最良の選択肢の1つは、実際にOracleを可能な限り避けることです。 私はこれに困惑しましたが、非常に多くの場合、Javaプロセスは、OCIを使用する(SQL Plusを読む)Oracleの多くのユーティリティよりも優れている場合があります。 )。

これにより、特定のヒント(/ APPEND /など)の使用が妨げられることはありません。

そのような解決策に目を向けるたびに、私はうれしい驚きを覚えました。

乾杯、

ロロ

高速挿入に関する推奨事項を以下に示します。

トリガー-テーブルに関連付けられているトリガーを無効にします。挿入が完了したら有効にします。

インデックス-挿入が完了したら、インデックスを削除して再作成します。

古い統計-テーブルとインデックスの統計を再分析します。

インデックスの最適化-必要に応じてインデックスを再構築 ロギングなしを使用-INSERT APPENDを使用して挿入(Oracleのみ)。このアプローチは非常にリスクの高いアプローチです。REDOログは生成されないため、ロールバックはできません。開始する前にテーブルのバックアップを作成し、ライブテーブルを試さないでください。データベースに同様のオプションがあるかどうかを確認します

並列挿入:並列挿入を実行すると、ジョブが高速になります。

一括挿入を使用 制約-挿入中のオーバーヘッドはあまりありませんが、ステップ1の後でもまだ遅い場合は、チェックすることをお勧めします

詳細については、 http://www.dbarepublic.com/2014をご覧ください。 /04/slow-insert.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top