web-dev-qa-db-ja.com

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

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

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

insert into mytable values r_myRow;

次のようにすることでパフォーマンスを得ることができたようです。

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

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

11
JoshL

PL/SQL表とFORALLを使用して挿入文にバインドし、一度に数百行を挿入することをお勧めします。詳細については、 ここ を参照してください。

PL/SQL表の作成方法にも注意してください。 PL/SQLで行ごとの操作を実行するとSQLよりも低速になるため、可能であれば、代わりに「INSERT INTO t1SELECT ...」を使用してSQLですべての変換を直接実行することをお勧めします。

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

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

16
CaptainPicard

通常の挿入ステートメントは、テーブル内のデータを取得するための最も遅い方法であり、一括挿入を目的としたものではありません。次の記事では、パフォーマンスを向上させるためのさまざまな手法について説明しています。 http://www.dba-Oracle.com/Oracle_tips_data_load.htm

2
Joeri Sebrechts

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

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

1
MusiGenesis

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');
1
skk

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

0
MusiGenesis

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

  1. あなたのケースで考慮すべき主なポイントは、追加ヒントを使用することです。これは、フリーリストを使用する代わりに、テーブルに直接追加するためです。ロギングをオフにする余裕がある場合は、ロギングのヒントを付けて追加を使用してください。
  2. PL/SQLで繰り返す代わりに、一括挿入を使用する
  3. ファイルフィードからデータを取得している場合は、sqlloadedを使用してデータをテーブルに直接ロードします
0
Kalpesh Patel

おそらく、最善の選択肢の1つは、実際にはOracleをできるだけ避けることです。私はこれに戸惑いましたが、Javaプロセスは、OCI(SQL Plusを読む)を使用するか、多くの時間を費やすOracleのユーティリティの多くを上回ることがよくあります。正しく理解するために(SQL * Loaderを読んでください)。

これにより、特定のヒントを使用することもできます(/ [〜#〜] append [〜#〜] /など)。

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

乾杯、

ロロ

0
Rollo Tomazzi

これが高速挿入に関する私の推奨事項です。

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

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

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

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

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

一括挿入制約を使用する-挿入中のオーバーヘッドはそれほど多くありませんが、手順1を実行した後でも遅いかどうかを確認することをお勧めします。

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

0
pbaniya04