12

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

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

insert into mytable values r_myRow;

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

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

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

4

8 に答える 8

16

PL/SQL テーブルと FORALL を使用して挿入ステートメントにバインドし、一度に数百行を挿入する方がはるかに優れています。詳細はこちらをご覧ください

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

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

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

于 2008-09-27T16:28:55.180 に答える
2

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

于 2008-09-27T15:58:38.497 に答える
1

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

于 2008-09-27T15:54:37.027 に答える
1

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

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

于 2008-09-27T15:58:54.690 に答える
1

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');
于 2012-12-14T22:45:33.997 に答える
0

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

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

高速挿入に関する私の推奨事項は次のとおりです。

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

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

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

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

Parallel Insert: Parallel Insert を実行すると、ジョブが高速化されます。

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

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

于 2015-02-04T16:52:39.310 に答える
-1

おそらく、最善の選択肢の 1 つは、実際にはできるだけ Oracle を避けることです。私はこれに困惑していますが、Java プロセスは、OCI を使用する (SQL Plus を参照) か、正しく処理するために多くの時間を費やす Oracle のユーティリティの多くよりもパフォーマンスが優れていることがよくあります (SQL*Loader を参照)。 )。

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

そのようなソリューションに目を向けるたびに、私はうれしい驚きを感じてきました。

乾杯、

ロロ

于 2009-03-19T14:00:33.077 に答える