質問
データを処理してテーブルにロードする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
- 考慮すべき主なポイント ケースはこれとしてAppendヒントを使用することです テーブルに直接追加します freelistを使用する代わりに。ロギングをオフにする余裕がある場合は、nologgingヒント付きのappendを使用してそれを実行します
- PL / SQLで反復する代わりに一括挿入を使用する
- ファイルフィードからデータを取得する場合は、sqlloadedを使用してデータをテーブルに直接ロードします
おそらく最良の選択肢の1つは、実際にOracleを可能な限り避けることです。 私はこれに困惑しましたが、非常に多くの場合、Javaプロセスは、OCIを使用する(SQL Plusを読む)Oracleの多くのユーティリティよりも優れている場合があります。 )。
これにより、特定のヒント(/ APPEND /など)の使用が妨げられることはありません。
そのような解決策に目を向けるたびに、私はうれしい驚きを覚えました。
乾杯、
ロロ
高速挿入に関する推奨事項を以下に示します。
トリガー-テーブルに関連付けられているトリガーを無効にします。挿入が完了したら有効にします。
インデックス-挿入が完了したら、インデックスを削除して再作成します。
古い統計-テーブルとインデックスの統計を再分析します。
インデックスの最適化-必要に応じてインデックスを再構築 ロギングなしを使用-INSERT APPENDを使用して挿入(Oracleのみ)。このアプローチは非常にリスクの高いアプローチです。REDOログは生成されないため、ロールバックはできません。開始する前にテーブルのバックアップを作成し、ライブテーブルを試さないでください。データベースに同様のオプションがあるかどうかを確認します
並列挿入:並列挿入を実行すると、ジョブが高速になります。
一括挿入を使用 制約-挿入中のオーバーヘッドはあまりありませんが、ステップ1の後でもまだ遅い場合は、チェックすることをお勧めします
詳細については、 http://www.dbarepublic.com/2014をご覧ください。 /04/slow-insert.html