9

私はこのようなSQLを持っています:

Insert into A
Select * from B;

今、私はそれを並行して実行したいと思います。私の質問は、挿入または選択、あるいはその両方を並列化することですか?次のsqlsを参照してください。どちらが正しいか、またはどれが最高のパフォーマンスを発揮するかを教えてください。dba権限がないため、実行計画を確認できません。

1) Insert /*+ parallel(A 6) */ into A select * from B;

2) Insert into A select/*+ parallel(B 6) */ * from B;

3) Insert /*+ parallel(A 6) */ into A select /*+ parallel(B 6) */ * from B;

ありがとうございました!

4

2 に答える 2

14

との両方を並列化INSERTするのSELECTが最速です。

(十分な量のデータがある場合は、適切なサーバーがあり、すべてが正常に構成されているなど)

特に最適な並列度を見つけるために、自分でテストすることをお勧めします。Oracleの並列実行には多くの神​​話があり、マニュアルでさえひどく間違っていることがあります。

11gR2では、次のようにステートメントを実行することをお勧めします。

alter session enable parallel dml;
insert /*+ append parallel(6) */ into A select * from B;
  1. 常に最初に並列dmlを有効にする必要があります。
  2. parallel(6)オブジェクトレベルの並列処理ではなく、ステートメントレベルの並列処理を使用します。これは11gR2の機能であり、オブジェクトのエイリアスやアクセス方法を気にすることなく、すべてを並行して簡単に実行できます。10Gの場合、複数のヒントを使用する必要があります。
  3. 通常、appendヒントは必要ありません。DMLが並行して実行される場合、直接パス挿入が自動的に使用されます。ただし、ステートメントがシリアルにダウングレードされた場合、たとえば、使用可能な並列サーバーがない場合、appendヒントは大きな違いを生む可能性があります。
于 2012-05-03T04:01:04.047 に答える
1

Explainプランを実行するためにDBA特権は必要ありません。SELECT_CATALOGが正しい特権だと思います。

于 2012-05-03T09:45:27.970 に答える