6

私のアプリケーションでは、多くのレコードを追加する必要があります。私は次の構成を使用しています:

   INSERT /*+ append parallel(t1, 4) parallel(t2, 4) */ ALL
   INTO t1 (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t2 (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t2 (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;

APPENDとPARALLELのヒントも使用しています。2つの異なるテーブルにデータを挿入していることに注意してください。並列が無視されているようです(DBAが教えてくれました)。それで、それが使用されているかどうかをどうやって知ることができますか?そのような構成でPARALLELヒントを使用することは可能ですか?効果はありますか?

4

4 に答える 4

4

これはおそらくそれを機能させるのに十分でしょう:

alter session enable parallel dml;

次のようなクエリを使用して、実際の並列度を確認できます。

select px_servers_executions, v$sql.*
from v$sql where lower(sql_text) like '%insert%parallel%' order by last_load_time desc;

それでも並列処理が得られない場合は、多くの理由が考えられます。まず、次のパラメータを確認します。

select * from v$parameter where name like 'parallel%'

ただし、挿入ステートメントに並列処理は必要ないでしょう。並列処理には大量のオーバーヘッドがあり、通常、数千または数百万のレコードを処理する場合にのみ役立ちます。

あなたの本当の問題は、大きなSQLステートメントを解析するときだと思います。マルチテーブルインサートは特に悪いです。数百行を超える行を挿入しようとすると、クエリの解析に数秒かかります。また、Oracleのバージョンによっては、501テーブルを使用しようとすると永久にハングします。1つの大きなクエリではなく、いくつかの小さなクエリを実行する方がはるかに高速です。たとえば、100行の5つの挿入は、500行の1つの挿入よりもはるかに高速に実行されます。(一般に、これはOracleのパフォーマンス調整方法とは正反対です。これは、大きなSQLステートメントの解析に関連するバグのための特殊なケースです。)

于 2011-05-18T03:31:26.683 に答える
2

APPENDヒントは、INSERTステートメントのサブクエリ構文でのみサポートされ、VALUES句ではサポートされません。VALUES句でAPPENDヒントを指定すると、それは無視され、従来の挿入が使用されます。VALUES句でダイレクトパスINSERTを使用するには、「APPEND_VALUESヒント」を参照してください。

于 2014-09-29T00:46:24.817 に答える
1

並列処理が無効になっている場合があります。含む、 Oracleのドキュメントから:

トリガーまたは参照整合性制約を定義したテーブルでのDML操作では、並列処理が無効になっています。

これは私にはかなり大きな制限のように思えます。テーブルにトリガーまたは外部キーがありますか?

于 2011-05-18T03:56:46.297 に答える
1

30レコードの並列処理を有効にすると、リソースが無駄になります。並列処理には、このような小さな操作のコストに見合わない高価なオーバーヘッド(作業の分割、プロセスの割り当て、結果の同期など)が含まれます。

あなたがそれをそれほどひどく最適化したいのなら、あなたはこのステートメントを何百万回も実行していると思います。その場合、これらの百万のステートメントを大きなセット操作に変換する方法を見つける方がおそらくより効率的です-それは並列処理からうまく利益を得ることができます。


更新:別のアイデアは、複数のセッションでステートメントを実行し、DIY並列処理を効果的に実装することです。複数のセッションが入力データを読み取り、同時に挿入するようにプロセスを設計できますか?

于 2011-05-18T09:20:56.407 に答える